Java和Joda时间:日期值错误

Java和Joda时间:日期值错误,java,jodatime,Java,Jodatime,当我试图解析如下字符串日期时,我在中得到了一个错误的日期: 2013-11-20 18:20:00+01:00 我希望获得以下日期: 2013年11月20日星期三19:20:00 CET 但我得到了: 2013年11月20日星期三18:20:00 CET 我正在使用Joda Time,这是我的代码: String dateString = "2013-11-20 18:20:00 +01:00"; DateTimeFormatter formatter = DateTimeFormat.forP

当我试图解析如下字符串日期时,我在中得到了一个错误的日期:

2013-11-20 18:20:00+01:00

我希望获得以下日期:
2013年11月20日星期三19:20:00 CET
但我得到了:
2013年11月20日星期三18:20:00 CET

我正在使用Joda Time,这是我的代码:

String dateString = "2013-11-20 18:20:00 +01:00";
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z");
DateTime temp = formatter.parseDateTime(dateString);
Date date = temp.toDate();

标准问题:你在哪个时区?CET

我假设解析的日期时间是正确的?它有什么时区

记住日期没有时区。我甚至不确定它是否真的考虑了Timezone.getDefault()

简而言之,你的时区与+1不同,这就是为什么你的时间被移动了一个小时

--编辑--
等等你为什么期望19点20分?文本上写着18:20+1,Joda像那样解析这个,Date去掉时区。就是这样。

标准问题:你在哪个时区?CET

我假设解析的日期时间是正确的?它有什么时区

记住日期没有时区。我甚至不确定它是否真的考虑了Timezone.getDefault()

简而言之,你的时区与+1不同,这就是为什么你的时间被移动了一个小时

--编辑-- 等等你为什么期望19点20分?文本上写着18:20+1,Joda像那样解析这个,Date去掉时区。就这样。

期望值 你的期望是错误的

“+01:00”表示时间比/GMT早一小时。因此,调整到UTC意味着减去一小时(17:20),而不是增加一小时(19:20)

“+01:00”的作用与所说的相同,意思是比UTC/GMT提前一小时。所以

2013-11-20 18:20:00+01:00
=
2013年11月20日星期三18:20:00 CET

…这是两种不同的方式来表述同一时间,同一小时

当我在美国西海岸时间运行你的代码时,我得到…(注意相同的时间)

温度:2013-11-20T09:20:00.000-08:00 日期:2013年11月20日星期三09:20:00太平洋标准时间 j、 美国日期混淆 如前所述,您可能被java.util.Date愚弄了。对象本身没有时区信息。然而,该方法的实现在呈现要显示的文本时使用默认时区。令人困惑避免使用java.util.Date/Calendar类的众多原因之一。相比之下,Joda时间对象确实知道自己的时区

指定时区 你真正的问题非常普遍:忽略时区。如果未指定时区,则使用默认时区。正如您在上面看到的,我的默认时区与您的不同,因此在运行同一代码时得到了不同的结果

更好的做法是始终指定时区。如果您想要UTC/GMT,请说出来。如果你想要CET,就说出来。(实际上,不要使用三个字母的代码,如
CET
,因为它们不是标准化的,并且有重复项–使用时区名称,如Europe/Prague或Europe/Paris。)解析该字符串时,指定要合并到新DateTime对象中的时区

示例代码 下面是一些示例代码,演示如何在解析时指定时区。注意对的调用

请注意,所有三个帕辛的结果都是宇宙时间线中的同一时刻。为了说明这一点,我的代码将自备份每个DateTime对象以来的毫秒转储到控制台。通常我尽量不使用,也不考虑从纪元开始的毫秒数。但在这里,从epoch开始使用毫秒证明了一点

/©2013巴西尔布尔克。此源代码可以由任何对此承担全部责任的人自由使用。
//导入org.joda.time.*;
//导入org.joda.time.format.*;
String dateString=“2013-11-20 18:20:00+01:00”;
DateTimeFormatter formatter=DateTimeFormat.forPattern(“yyyy-MM-dd HH:MM:ss Z”);
//时区列表…http://joda-time.sourceforge.net/timezones.html  (不是最新的,详情请参阅第页)
DateTime dateTimeInUtc=格式化程序.withZone(DateTimeZone.UTC).parseDateTime(dateString);
DateTime dateTimeInPrague=格式化程序.withZone(DateTimeZone.forID(“欧洲/布拉格”)).parseDateTime(dateString);
DateTime dateTimeInVancouver=格式化程序.withZone(DateTimeZone.forID(“美国/温哥华”)).parseDateTime(dateString);
转储到控制台

System.out.println(“dateTimeInUtc:+dateTimeInUtc+”…从Unix纪元开始的毫秒数:+dateTimeInUtc.getMillis());
System.out.println(“dateTimeInPrague:+dateTimeInPrague+”…从Unix纪元开始以毫秒为单位:“+dateTimeInPrague.getMillis());
System.out.println(“dateTimeInVancouver:+dateTimeInVancouver+”…从Unix纪元开始以毫秒为单位:“+dateTimeInVancouver.getMillis());
运行时…(请注意,无论此代码是在您的计算机上运行还是在我的计算机上运行,我们都会得到相同的结果。
!)

dateTimeInUtc:2013-11-20T17:20:00.000Z…自Unix纪元起的毫秒数:13849680000000
dateTimeInPrague:2013-11-20T18:20:00.000+01:00…自Unix纪元起的毫秒数:1384968000000
dateTimeInVancouver:2013-11-20T09:20:00.000-08:00…自Unix纪元以来的毫秒数:1384968000000
期望值 你的期望是错误的

“+01:00”表示时间比/GMT早一小时。因此,调整到UTC意味着减去一小时(17:20),而不是增加一小时(19:20)

“+01:00”的作用与所说的相同,意思是比UTC/GMT提前一小时。所以

2013-11-20 18:20:00+01:00
=
2013年11月20日星期三18:20:00 CET

…这是两种不同的方式来表述同一时间,同一小时

当我在美国西海岸时间运行你的代码时,我得到…(注意相同的时间)

温度:2013-11-20T09:20:00.000-08:00 日期:2013年11月20日星期三09:20:00太平洋标准时间 j、 美国日期混淆 如前所述,您可能被java.util.Date愚弄了。