对于某些时区,通过JodaTime和java.Time设置时区后更正的时间会给出不同的结果,为什么?

对于某些时区,通过JodaTime和java.Time设置时区后更正的时间会给出不同的结果,为什么?,java,datetime,timezone,jodatime,java-time,Java,Datetime,Timezone,Jodatime,Java Time,下面是一个java小代码段,它试图将毫秒时间转换为可读的日期时间格式 Long timeInMillis=1615806808301l; //2021-03-15T16:43:28.301+05:30 IST String timeZone="Europe/Istanbul"; MutableDateTime mdateTime = new MutableDateTime(timeInMills); mdateTime.setZone(DateTimeZone.for

下面是一个java小代码段,它试图将毫秒时间转换为可读的日期时间格式

Long timeInMillis=1615806808301l; //2021-03-15T16:43:28.301+05:30 IST

String timeZone="Europe/Istanbul";

MutableDateTime  mdateTime  = new MutableDateTime(timeInMills);
mdateTime.setZone(DateTimeZone.forTimeZone(TimeZone.getTimeZone(timeZone)));

ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochMilli(timeInMills), ZoneId.of(timeZone));

以下是Joda[mdateTime]和Java.time[zdt]在毫秒和时区内给出的结果

Europe/Istanbul
2021-03-15T13:13:28.301+02:00[Europe/Istanbul]
2021-03-15T14:13:28.301+03:00[Europe/Istanbul]

Turkey
2021-03-15T13:13:28.301+02:00
2021-03-15T14:13:28.301+03:00[Turkey]

Europe/Moscow
2021-03-15T15:13:28.301+04:00
2021-03-15T14:13:28.301+03:00[Europe/Moscow]

Europe/Minsk
2021-03-15T14:13:28.301+03:00
2021-03-15T14:13:28.301+03:00[Europe/Minsk]
如你所见,对于某些时区,结果是不同的

PS:我的实际意图不是将timeInmillis转换为可读的日期-时间格式,而是理解结果不同的原因。


PS:系统时区为IST[+05:30]

根据您为Joda Time显示的结果,您可能正在使用非常旧的版本

时区随政府的突发奇想而变化。始终使用最新版本并掌握最新更新是非常重要的


升级到当前版本的Joda Time(撰写本文时为2.10.10),您报告的差异应消失。

检查以下通知:Joda Time是Java SE 8之前的Java事实上的标准日期和时间库。现在要求用户迁移到java.time(JSR-310)。另外,对于Joda time,我建议使用更简单的
新日期时间(timeInMillis,DateTimeZone.forID(timeZone))
。在任何情况下都不涉及旧的
时区
类。它的设计很差,Joda Time和java.Time都提供了完全有效的替代品。我无法用Joda Time 2.9.9重现您的结果。对于整个欧洲/伊斯坦布尔、土耳其和欧洲/莫斯科,我得到了
2021-03-15T14:13:28.301+03:00
。感谢所有的回复,问题出在我的Joda版本上,我使用的是Joda(2.1)的旧版本,升级到最新版本。谢谢,这确实是一个版本问题,我使用的是Joda 2.1,升级到最新版本修复了这个问题,@FredricFrancis每个版本的Joda Time、Java、操作系统和一些数据库(如Postgres)都有自己的文件副本。当您关心的任何时区正在更改其规则时,您必须使所有这些都保持最新。