我在Jodatime和Android上遇到奇怪的行为。我想解析字符串:
2014-05-19T18:13:00.000+02:00
到DateTime,并获取年,月,小时为整型。我首先在IntelliJ Studio上进行了一些测试,然后执行了以下操作:
String date = "2014-05-19T18:13:00.000+02:00";
DateTime dateTime = new DateTime(date);
System.out.println(dateTime.toString());
System.out.println(dateTime.getYear());
System.out.println(dateTime.getMonthOfYear());
System.out.println(dateTime.getDayOfMonth());
System.out.println(dateTime.getHourOfDay());
System.out.println(dateTime.getMinuteOfHour());
System.out.println(dateTime.getMillis());
这给了我正确答案:
2014-05-19T18:13:00.000+02:00
2014
5
19
18
13
1400515980000
现在,当我将IDE更改为Android Studio并执行相同操作时:
String dateT = "2014-05-19T18:13:00.000+02:00";
DateTime dateTime = new DateTime(dateT);
Lo.g(dateTime.getHourOfDay() + "");
Lo.g(dateTime.toString());
我的结果是:
16
2014-05-19T16:13:00.000Z
由于某些原因,Android Studio / Android上的DateTime并未考虑时区+2:00。
我找不到解决方案。在Joda中也没有简单的方法“ addTimeZone”。
如何使用DataTime显示正确的时间?我尝试了LocalDateTime,用DateTimeZone.getDefault()构造DateTime(这给了我UTF ...)
由于您说过在两个平台上都使用相同的Joda-Time版本,并且考虑到Joda-Time拥有自己的时区存储库而与系统时区数据无关的事实,因此可能只剩下一个解释,为什么您观察到不同的行为:要么输入不同显性的或隐性的。让我们详细介绍一下:
好吧,你说,显然,在相同的输入字符串下,会有相同的输入:
“ 2014-05-19T18:13:00.000 + 02:00”
因此,我们有相同的(明确的)输入。但是,等等,还有另一件事:隐式默认设置,它也可以抽象地视为一种输入。您使用构造函数DateTime(Object)
。BaseDateTime
如您在源代码中所见,此构造函数首先将委托给类的超级构造函数。
public DateTime(Object instant) {
super(instant, (Chronology) null);
}
这个超级构造函数的javadoc说:
“使用指定的时间顺序从表示日期时间的对象构造一个实例。如果时间顺序为null,则使用默认时区中的ISO。
可识别的对象类型在ConverterManager中定义,包括ReadableInstant,String,Calendar和Date。”
所以最后我们看到Joda-Time使用默认时区。通过研究源代码和文档,这确实是发生不同行为的唯一可能性。其他所有条件都相同:库版本相同,显式字符串输入相同,测试场景相同。
结论:您的平台上具有不同的默认时区。请注意,但是,由于-object内的内部时区/偏移设置不同,因此在两个平台上都具有相同的瞬间,只是以不同的本地时间戳和偏移量表示DateTime
。
更新:我已经使用以下代码测试了区域覆盖行为:
String date = "2014-05-19T19:13:00.000+03:00"; // same instant as yours (just with offset +03)
DateTime dateTime = new DateTime(date);
System.out.println(dateTime.toString());
// output: 2014-05-19T18:13:00.000+02:00 (in my default timezone Europe/Berlin)
因此,默认时区优先于字符串输入中的任何偏移量。如果您想使用解析后的偏移量,请查看使用DateTimeFormatter及其方法withOffsetParsed()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句