LppEdd
LppEdd

Reputation: 21104

SimpleDateFormat to java.time

I'm trying to understand how the Java 8 date/time framework works.
I'm actually using SimpleDateFormat this way to return milliseconds given a string:

new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(builder.toString()).getTime();

What would it become with the new classes in Java 8?

Upvotes: 3

Views: 969

Answers (2)

Meno Hochschild
Meno Hochschild

Reputation: 44061

The pattern you specified cannot work in Java-8. The problem has been fixed in Java-9 with seemingly no backport, but Java-9 is not yet released.

Possible workarounds for Java-8 either include awkward string preprocessing, that is inserting a decimal separator before the fraction part or downloading other 3rd-party-libraries (where the parsers are probably still quicker than in Java-9 according to my observations):

String preprocessing

String mydate = "20130812214600025";
String adjustedInput = new StringBuilder(mydate).insert(14, '.').toString();
ZonedDateTime date =
    ZonedDateTime.parse(
        adjustedInput,
        DateTimeFormatter.ofPattern("yyyyMMddHHmmss.SSS").withZone(ZoneOffset.systemDefault()));
System.out.println(date); // 2013-08-12T21:46:00.025+02:00[Europe/Berlin]
System.out.println(date.toInstant().toEpochMilli()); // 1376336760025

Joda-Time:

String mydate = "20130812214600025";
DateTime date =
    DateTime.parse(
        mydate,
        DateTimeFormat.forPattern("yyyyMMddHHmmssSSS"));
System.out.println(date); // 2013-08-12T21:46:00.025+02:00
System.out.println(date.toInstant().getMillis()); // 1376336760025

My library Time4J

long millisSinceUnix =
    ChronoFormatter.ofPattern(
        "yyyyMMddHHmmssSSS",
        PatternType.CLDR,
        Locale.ROOT,
        Moment.axis(TemporalType.MILLIS_SINCE_UNIX)
    ).with(Timezone.ofSystem()).parse(mydate).longValue();
System.out.println(millisSinceUnix); // 1376336760025

For your information: The timezone is needed because we convert local details like year, month, day, hour etc to a global instant but your input does not contain any zone or offset information. Therefore it is necessary to supply the formatter with a zone or offset.

As you can see, SimpleDateFormat and Joda-Time use the system timezone by default (implicitly). However, the java.time-API and Time4J require to explicitly specify a timezone (IMHO the cleaner design).

Upvotes: 2

reos
reos

Reputation: 8324

You can use:

ZonedDateTime date = ZonedDateTime.parse("mydate",DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
System.out.println(date.toInstant().toEpochMilli());

Upvotes: 1

Related Questions