gpt4 book ai didi

android - 如何使用时区从 JodaTime 获取小时数

转载 作者:行者123 更新时间:2023-11-30 02:53:19 24 4
gpt4 key购买 nike

我遇到了 Jodatime 和 Android 的奇怪行为。我想解析字符串:

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

转为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...)

最佳答案

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

好吧,你说,给定相同的输入字符串,显然有相同的输入:

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

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

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

javadoc这个 super 构造函数的作者说:

"Constructs an instance from an Object that represents a datetime, using the specified chronology. If the chronology is null, ISO in the default time zone is used.

The recognised object types are defined in ConverterManager and include ReadableInstant, String, Calendar and Date."

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

结论:您的平台上有不同的默认时区。请注意,您在两个平台上得到的是相同的瞬间,只是由于以下原因,用不同的本地时间戳和偏移量表示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()

关于android - 如何使用时区从 JodaTime 获取小时数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23745821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com