Skip to content
Snippets Groups Projects
Commit f6a1bdbf authored by Brutzman, Don's avatar Brutzman, Don
Browse files

improved java.time conversion routines

parent fddb1b07
No related branches found
No related tags found
No related merge requests found
......@@ -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));
}
/**
......
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)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment