如何将ZonedDateTime转换为Joda DateTime

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

格式错误:“2015-01-25T23:35:07.684Z [Europe / London]”在[欧洲/伦敦]格式错误

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 

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

我会建议将ZonedDateTime转换为DateTime是:

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

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

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