diff --git a/src/edu/nps/moves/dis7/utilities/DisTime.java b/src/edu/nps/moves/dis7/utilities/DisTime.java index 5c2a1d19dab48c7b52af82d38be533fed21ee0f5..06172c85e116e9692e43a1264615e1f6a6aa774d 100644 --- a/src/edu/nps/moves/dis7/utilities/DisTime.java +++ b/src/edu/nps/moves/dis7/utilities/DisTime.java @@ -8,6 +8,8 @@ package edu.nps.moves.dis7.utilities; import edu.nps.moves.dis7.pdus.*; import java.text.SimpleDateFormat; import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.*; /** @@ -171,6 +173,82 @@ public class DisTime private static final String dateFormatPattern = "yyyy-mm-dd"; private static final String timeFormatPattern = "HH:mm:ss"; + /** Enumerations for prepared time formatters */ + public enum TimeFormatterType + { + /** time formatter output accuracy in seconds */ + SECONDS, + /** time formatter output accuracy in tenths of seconds */ + TENTHSECONDS, + /** time formatter output accuracy in hundredths of seconds */ + HUNDREDTHSECONDS, + /** time formatter output accuracy in milliseconds */ + MILLISECONDS, + /** time formatter output accuracy in microseconds */ + MICROSECONDS, + /** time formatter output accuracy in nanoseconds */ + NANOSECONDS; + } + + /** Format time <code>HH:mm:ss</code> + * @see java.time.format.DateTimeFormatter */ + public static final DateTimeFormatter timeFormatterSeconds = DateTimeFormatter.ofPattern("HH:mm:ss"); + /** Format time <code>HH:mm:ss.S</code>, default + * @see java.time.format.DateTimeFormatter */ + public static final DateTimeFormatter timeFormatterTenthSeconds = DateTimeFormatter.ofPattern("HH:mm:ss.S"); + /** Format time <code>HH:mm:ss.SS</code> + * @see java.time.format.DateTimeFormatter */ + public static final DateTimeFormatter timeFormatterHundredthSeconds = DateTimeFormatter.ofPattern("HH:mm:ss.SS"); + /** Format time <code>HH:mm:ss.SSS</code> + * @see java.time.format.DateTimeFormatter */ + public static final DateTimeFormatter timeFormatterMilliSeconds = DateTimeFormatter.ofPattern("HH:mm:ss.SSS"); + /** Format time <code>HH:mm:ss.SSSSSS</code> + * @see java.time.format.DateTimeFormatter */ + public static final DateTimeFormatter timeFormatterMicroSeconds = DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSS"); + /** Format time <code>HH:mm:ss.SSSSSSSSS</code> + * @see java.time.format.DateTimeFormatter */ + public static final DateTimeFormatter timeFormatterNanoSeconds = DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSSSSS"); + + private static DateTimeFormatter timeFormatter = timeFormatterTenthSeconds; + + /** + * Get time format used for text logging + * @return current timeFormatter + */ + public static DateTimeFormatter getTimeFormatter() + { + return timeFormatter; + } + /** + * Set time format for text logging + * @param timeFormatterChoice enumeration for the new timeFormatter to set + */ + public static void setTimeFormatter(DisTime.TimeFormatterType timeFormatterChoice) + { + switch (timeFormatterChoice) + { + case SECONDS: + timeFormatter = DisTime.timeFormatterSeconds; + break; + case TENTHSECONDS: + timeFormatter = DisTime.timeFormatterTenthSeconds; + break; + case HUNDREDTHSECONDS: + timeFormatter = DisTime.timeFormatterHundredthSeconds; + break; + case MILLISECONDS: + timeFormatter = DisTime.timeFormatterMilliSeconds; + break; + case MICROSECONDS: + timeFormatter = DisTime.timeFormatterMicroSeconds; + break; + case NANOSECONDS: + timeFormatter = DisTime.timeFormatterNanoSeconds; + break; + // no others allowed + } + } + // public static DisTime disTime = null; /** @@ -373,40 +451,54 @@ public class DisTime } /** - * Convert timestamp value to Instant for time operationss, - * taking into account epochLvc and TimeStampStyle (DIS absolute/relative, Unix or Year). + * Convert timestamp value to Instant for time operations. + * TODO take into account epochLvc and TimeStampStyle (DIS absolute/relative, Unix or Year). * TODO consider different formats for different timestampStyle values. - * @param timestamp value in milliseconds + * @param timestamp value in seconds * @return corresponding Instant value (with 31-bit fidelity) */ - public static Instant convertToInstant(int timestamp) + public static Instant convertToInstant(long timestamp) { - return Instant.now(); // TODO + // https://stackoverflow.com/questions/57411881/create-java-datetime-instant-from-microseconds + return Instant.EPOCH.plus(timestamp,ChronoUnit.SECONDS); } /** - * Convert timestamp value to Instant for time operations, - * taking into account epochLvc and TimeStampStyle (DIS absolute/relative, Unix or Year). + * Convert timestamp value to LocalTime for time operations. + * TODO take into account epochLvc and TimeStampStyle (DIS absolute/relative, Unix or Year). * TODO consider different formats for different timestampStyle values. - * @param timestamp value in milliseconds + * @param timestamp value in seconds * @return corresponding Instant value (with 31-bit fidelity) */ - public static LocalDateTime convertToLocalDateTime(int timestamp) + public static LocalTime convertToLocalTime(long timestamp) { - return LocalDateTime.now(); // TODO + return LocalTime.ofSecondOfDay(timestamp); } /** - * Convert timestamp value to Instant for time operations, - * taking into account epochLvc and TimeStampStyle (DIS absolute/relative, Unix or Year). + * Convert timestamp value to LocalDateTime for time operations. + * TODO take into account epochLvc and TimeStampStyle (DIS absolute/relative, Unix or Year). * TODO consider different formats for different timestampStyle values. - * @param timestamp value in milliseconds - * @return corresponding Instant value (with 31-bit fidelity) + * @param timestamp value in seconds + * @return corresponding LocalDateTime value (with 31-bit fidelity) */ + public static LocalDateTime convertToLocalDateTime(long timestamp) + { + ZoneOffset zoneOffset = ZoneOffset.UTC; + return LocalDateTime.ofEpochSecond(timestamp,0,zoneOffset); + } + + /** + * TODO Convert timestamp value to ZonedDateTime for time operations. + * TODO take into account epochLvc and TimeStampStyle (DIS absolute/relative, Unix or Year). + * TODO consider different formats for different timestampStyle values. + * @param timestamp value in LocalDateTime + * @return corresponding Instant value (with 31-bit fidelity) public static ZonedDateTime convertToZonedDateTime(int timestamp) { return ZonedDateTime.now(); // TODO } + */ /** * Convert timestamp value to string for logging and diagnostics, @@ -563,6 +655,7 @@ public class DisTime } catch (InterruptedException ex) {} } + /** Self-test for basic smoke testing */ private void selfTest() { @@ -609,6 +702,13 @@ public class DisTime System.out.println("DisTime.getEpochLvc(), Instant.now(), duration = " + DisTime.getEpochLvc() + ", " + now + ", " + java.time.Duration.between(getEpochLvc(), now).toMillis() + " msec"); // System.out.println("DisTime.getCurrentDisTimeUnitsSinceTopOfHour() = " + convertToString(DisTime.getCurrentDisTimeUnitsSinceTopOfHour()) + " = " + DisTime.getCurrentDisTimeUnitsSinceTopOfHour()); + + long timeSeconds = (83 * 60); // 83 minutes * 60 seconds/minute = 00:01:23 + System.out.println("time checks:"); + System.out.println("timeSeconds (83 minutes * 60 seconds/minute) = " + timeSeconds + " seconds"); + System.out.println("DisTIme.convertToLocalTime(timeSeconds) = " + DisTime.convertToLocalTime (timeSeconds).format(DisTime.getTimeFormatter())); + System.out.println("DisTime.convertToLocalDateTime(timeSeconds) = " + DisTime.convertToLocalDateTime(timeSeconds).format(DisTime.getTimeFormatter())); + System.out.println("DisTime.convertToInstant(timeSeconds) = " + DisTime.convertToInstant (timeSeconds)); } /** diff --git a/src/edu/nps/moves/dis7/utilities/DisTimeLog.txt b/src/edu/nps/moves/dis7/utilities/DisTimeLog.txt index 178b7899cb61796495f6a953182ead0ba9646cda..ac3d3b5c4e8d53a49f3301ba44727438e73ca2e3 100644 --- a/src/edu/nps/moves/dis7/utilities/DisTimeLog.txt +++ b/src/edu/nps/moves/dis7/utilities/DisTimeLog.txt @@ -1,30 +1,32 @@ -ant -f C:\\x3d-github\\open-dis7-java -Dnb.internal.action.name=run.single -Djavac.includes=edu/nps/moves/dis7/utilities/DisTime.java -Drun.class=edu.nps.moves.dis7.utilities.DisTime run-single +ant -f C:\\x3d-github\\opendis7-java -Dnb.internal.action.name=run.single -Djavac.includes=edu/nps/moves/dis7/utilities/DisTime.java -Drun.class=edu.nps.moves.dis7.utilities.DisTime run-single init: -Deleting: C:\x3d-github\open-dis7-java\build\built-jar.properties +Deleting: C:\x3d-github\opendis7-java\build\built-jar.properties deps-jar: -Updating property file: C:\x3d-github\open-dis7-java\build\built-jar.properties -Compiling 1 source file to C:\x3d-github\open-dis7-java\build\classes +Updating property file: C:\x3d-github\opendis7-java\build\built-jar.properties +Compiling 1 source file to C:\x3d-github\opendis7-java\build\classes +warning: [options] bootstrap class path not set in conjunction with -source 8 +1 warning compile-single: run-single: *** DisTime.main() self test started... === legacy java.util.Date, calendar methods === DisTime.getTimestampStyle() = IEEE_ABSOLUTE patterns yyyy-mm-dd HH:mm:ss -DisTime.getCurrentDisTimestamp() initialTimestamp = 1969-47-20 22:47:26 = 3369014103 = -925953193 (unsigned vs signed output) -DisTime.getCurrentDisTimestamp() = 1969-47-20 22:47:37 = 3369026033 = -925941263 (unsigned vs signed output) -DisTime.getCurrentDisAbsoluteTimestamp() = 1969-47-20 22:47:38 = 3369026033 -DisTime.getCurrentDisRelativeTimestamp() = 1969-47-20 22:47:38 = 3369026032 -DisTime.getCurrentDisTimeUnitsSinceTopOfHour() = 1970-55-20 03:55:13 = 1684513016 +DisTime.getCurrentDisTimestamp() initialTimestamp = 1970-50-20 10:50:56 = 1709456635 = 1709456635 (unsigned vs signed output) +DisTime.getCurrentDisTimestamp() = 1970-51-20 10:51:03 = 1709463793 = 1709463793 (unsigned vs signed output) +DisTime.getCurrentDisAbsoluteTimestamp() = 1970-51-20 10:51:03 = 1709463793 +DisTime.getCurrentDisRelativeTimestamp() = 1970-51-20 10:51:03 = 1709463792 +DisTime.getCurrentDisTimeUnitsSinceTopOfHour() = 1970-25-10 13:25:31 = 854731896 === modern java.time methods === note that LocalDateTime is current time zone while default Instant is UTC with time zone Z appended -java.time.LocalDateTime.now(), Instant.now() = 2022-01-29T11:47:03.889534800, 2022-01-29T19:47:03.889534800Z -java.time.LocalDateTime.now(), Instant.now() = 2022-01-29T11:47:03.889534800, 2022-01-29T19:47:03.889534800Z -java.time.LocalDateTime.now(), Instant.now() = 2022-01-29T11:47:03.901330100, 2022-01-29T19:47:03.901330100Z +java.time.LocalDateTime.now(), Instant.now() = 2022-06-22T21:23:52.867336500, 2022-06-23T04:23:52.868342300Z +java.time.LocalDateTime.now(), Instant.now() = 2022-06-22T21:23:52.868342300, 2022-06-23T04:23:52.868342300Z +java.time.LocalDateTime.now(), Instant.now() = 2022-06-22T21:23:52.869142700, 2022-06-23T04:23:52.869142700Z sleep for 1000 msec... -java.time.LocalDateTime.now(), Instant.now() = 2022-01-29T11:47:04.905642300, 2022-01-29T19:47:04.905642300Z -java.time.LocalDateTime.now(), Instant.now() = 2022-01-29T11:47:04.905642300, 2022-01-29T19:47:04.905642300Z -java.time.LocalDateTime.now(), Instant.now() = 2022-01-29T11:47:04.906143, 2022-01-29T19:47:04.906143Z +java.time.LocalDateTime.now(), Instant.now() = 2022-06-22T21:23:53.876364700, 2022-06-23T04:23:53.876758200Z +java.time.LocalDateTime.now(), Instant.now() = 2022-06-22T21:23:53.876758200, 2022-06-23T04:23:53.876758200Z +java.time.LocalDateTime.now(), Instant.now() = 2022-06-22T21:23:53.876758200, 2022-06-23T04:23:53.876758200Z DisTime.hasEpochLvc() default = false DisTime.setEpochLvc(Instant.now())... DisTime.hasEpochLvc(), = true @@ -32,8 +34,13 @@ clearEpochLvc()... DisTime.hasEpochLvc() = false DisTime.setEpochLvcNow()... DisTime.hasEpochLvc(), = true -DisTime.getEpochLvc(), Instant.now(), duration = 2022-01-29T19:47:04.908150200Z, 2022-01-29T19:47:04.908150200Z, 0 msec +DisTime.getEpochLvc(), Instant.now(), duration = 2022-06-23T04:23:53.877164600Z, 2022-06-23T04:23:53.877164600Z, 0 msec sleep for 1000 msec... -DisTime.getEpochLvc(), Instant.now(), duration = 2022-01-29T19:47:04.908150200Z, 2022-01-29T19:47:05.913576500Z, 1005 msec +DisTime.getEpochLvc(), Instant.now(), duration = 2022-06-23T04:23:53.877164600Z, 2022-06-23T04:23:54.879450100Z, 1002 msec +time checks: +timeSeconds (83 minutes * 60 seconds/minute) = 4980 seconds +DisTIme.convertToLocalTime(timeSeconds) = 01:23:00.0 +DisTime.convertToLocalDateTime(timeSeconds) = 01:23:00.0 +DisTime.convertToInstant(timeSeconds) = 1970-01-01T01:23:00Z *** DisTime.main() self test complete. BUILD SUCCESSFUL (total time: 3 seconds)