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

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

最佳答案

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信息库进行更新(对于Joda:更新到最新版本,对于JDK:使用tz-updater-tool)

  • 这通常是比仅默默地退回任何UTC等任意tz-offset更好的策略。

    08-18 16:29