2014-05-19 70 views
1

我遇到了Jodatime和Android的奇怪行为。我想解析字符串:如何从JodaTime时区获得小时

2014-05-19T18:13:00.000+02:00 

to DateTime,并获得年,月,小时为int。我开始上的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 ...)

+0

好吧,我用DateTimeFormatter得到了正确的值,但我仍然不知道这个区别是什么。 – Bresiu

+0

您是否已验证两个平台上的Joda时间版本相同? –

+0

是的,我已经在两个平台上使用最新版本。 – Bresiu

回答

1

既然你说你在这两个平台上使用相同的Joda-Time版本,并且关于Joda-Time有它的事实自己的时区存储库独立于系统时区数据,可能只有一个解释,为什么你观察到不同的行为:不同的输入显式或隐式。让我们进入细节:

嗯,你说的,显然是有给予相同的输入字符串相同的输入:

“2014-05-19T18:13:00.000 + 02:00”

所以我们有相同的(明确的)输入。但是,等一下,还有另一件事:隐式默认设置它也可以被视为抽象方式的输入类型。您使用构造函数DateTime(Object)。此构造函数首先委托给类BaseDateTime的超级构造函数,如source code中所示。

public DateTime(Object instant) {   
    super(instant, (Chronology) null);  
} 

这个超级构造函数的javadoc说:

“从代表日期时间, 使用指定的年表的对象构造一个实例如果年表为null,ISO在 。使用默认时区

识别的对象类型在ConverterManager中定义, 包括ReadableInstant,String,Calendar和Date。“

因此,最后我们看到Joda-Time使用默认时区。通过研究源代码和文档,这实际上是我可以看到的不同行为的唯一可能性。所有其他事情都是相同的:相同的库版本和相同的显式字符串输入和相同的测试场景。

结论:你有你的平台上不同的默认时区。请注意,您在这两个平台上得到同一时刻然而,只是不同的本地时间戳和由于不同的内部时区/偏移代表DateTime -object内的偏移值设置。

更新:我已经测试区覆盖的行为与此代码:

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()

+0

这是一个很好的,有据可查的答案。感谢那。我在两个平台上测试了DateTimeZone.getDefault()方法,这给了我不同的时区(Android Studio + Genymotion - > UTC,IntelliJ Studio - >我的正确时区 - 欧洲/华沙)。正如你所说,我通过DateTimeFormatter解决了这个问题。 – Bresiu

+0

@Bresiu很高兴帮助你。我个人不喜欢隐式设置或默认设置,因为它很容易被忽略。 –