Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to convert from ZonedDateTime to Joda DateTime

I've switched to threeten for date times but I've still got a 3rd party tool that uses joda to write timestamp with timezone to the database and I need to convert from one to the other. What's the best way? As a workaround I tried DateTime.parse(zdt.toString) but it falls over because joda doesn't like the zone format

Invalid format: "2015-01-25T23:35:07.684Z[Europe/London]" is malformed at "[Europe/London]"

like image 898
Tim Pigden Avatar asked Jan 25 '15 23:01

Tim Pigden


2 Answers

Please notice that using DateTimeZone.forID(...) is not safe, which might throw DateTimeParseException as usually ZoneOffset.UTC has a ID "Z" which cannot be recognized by DateTimeZone.

What I would recommend in order to convert ZonedDateTime to DateTime is:

return new DateTime(
    zonedDateTime.toInstant().toEpochMilli(),
    DateTimeZone.forTimeZone(TimeZone.getTimeZone(zonedDateTime.getZone())));
like image 96
James Ding Avatar answered Sep 17 '22 14:09

James Ding


ZonedDateTime zdt = 
  ZonedDateTime.of(
    2015, 1, 25, 23, 35, 7, 684000000, 
    ZoneId.of("Europe/London"));

System.out.println(zdt); // 2015-01-25T23:35:07.684Z[Europe/London]
System.out.println(zdt.getZone().getId()); // Europe/London
System.out.println(zdt.toInstant().toEpochMilli()); // 1422228907684

DateTimeZone london = DateTimeZone.forID(zdt.getZone().getId());
DateTime dt = new DateTime(zdt.toInstant().toEpochMilli(), london);
System.out.println(dt); // 2015-01-25T23:35:07.684Z

In case the zone id transformation might crash for any unsupported or unrecognized id, I recommend to

  • catch and log it,
  • do updates of tz-repositories (for Joda: update to latest version, for JDK: use tz-updater-tool)

That is usually the better strategy than to just silently fall back to any arbitrary tz-offset like UTC.

like image 26
Meno Hochschild Avatar answered Sep 18 '22 14:09

Meno Hochschild