如何转换ZonedDateTime至Joda DateTime

时间:2015-01-25 23:40:33

标签: java jodatime threetenbp

我已经切换到三天的日期时间但我仍然有一个第三方工具,使用joda将带时区的时间戳写入数据库,我需要从一个转换为另一个。 什么是最好的方式? 作为一种解决方法,我尝试了DateTime.parse(zdt.toString),但由于joda不喜欢区域格式而失败了

格式无效:“2015-01-25T23:35:07.684Z [欧洲/伦敦]”格格不入“[欧洲/伦敦]”

3 个答案:

答案 0 :(得分:14)

请注意,使用DateTimeZone.forID(...)是不安全的,这可能会抛出DateTimeParseException,因为ZoneOffset.UTC通常具有ID" Z"这是DateTimeZone无法识别的。

我建议将ZonedDateTime转换为DateTime是:

return new DateTime(
    zonedDateTime.toInstant().toEpochMilli(),
    DateTimeZone.forTimeZone(TimeZone.getTimeZone(zonedDateTime.getZone())));

答案 1 :(得分:5)

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

如果区域ID转换可能因任何不受支持或无法识别的ID而崩溃,我建议

  • 抓住并记录,
  • 更新tz-repositories(对于Joda:更新到最新版本,对于JDK:使用tz-updater-tool)

这通常是更好的策略,而不是默默地回退到任何像UTC这样的任意tz偏移。

答案 2 :(得分:1)

这是一个kotlin扩展来做同样的事情(如果你这样编码)

fun ZonedDateTime.toDateTime(): DateTime =
    DateTime(this.toInstant().toEpochMilli(), 
        DateTimeZone.forTimeZone(TimeZone.getTimeZone(this.zone)))