其他分享
首页 > 其他分享> > android-Joda DateTime时区无法正确显示

android-Joda DateTime时区无法正确显示

作者:互联网

我在Android中使用Joda-Time DateTime.

看来DateTimeZone无法正常工作.也许与夏令时有关?

目前,我们有格林尼治标准时间2.冬季将在几周后改变.那将是格林尼治标准时间1.但是现在这是不正确的.

import org.joda.time.DateTime
import org.joda.time.DateTimeZone
import org.joda.time.LocalDateTime

// GMT: Thursday 26 October 2017 12:11:54
val epochTime: Long = 1509019914 

var dateServer = LocalDateTime(epochTime * 1000).toDateTime(DateTimeZone.forID("Europe/Amsterdam"))

预期(阿姆斯特丹的正确时间):

14:11:54 GMT+02:00 DST

实际:

13:11 2017-10-26T13:11:54.000+01:00

解决方法:

LocalDateTime构造函数获取epochTime值,并获取converts to the default timezone以获取日期和时间值-检查DateTimeZone.getDefault()的值,它可能是当前使用01:00偏移量的时区.

然后,toDateTime方法创建一个DateTime,该日期与LocalDateTime表示的相同日期和时间相对应,但是在指定的时区(它只是将时区“附加”到了日期/时间值,并且没有进行转换).

如果要获取与特定时区中的epochTime对应的日期和时间,则只需create the DateTime directly

val dateServer = DateTime(epochTime * 1000, DateTimeZone.forID("Europe/Amsterdam"));

这样,dateServer将是:

2017-10-26T14:11:54.000+02:00

为了更加清楚,我以默认时区为例.我的默认时区(由DateTimeZone.getDefault()返回)是America / Sao_Paulo,它使用2017年10月26日的偏移量-02:00(比UTC落后2小时).

epochTime 1509019914对应于UTC 2017-10-26T12:11:54Z.

当我执行LocalDateTime(epochTime * 1000)时,它将获取相应的UTC值(12:11)并转换为默认时区:在我的情况下,将转换为10:11,因此LocalDateTime的值将为2017-10-26T10: 11:54.

然后toDateTime方法仅在指定的时区创建一个与相同日期和时间(2017-10-26T10:11:54)对应的DateTime.因此它在阿姆斯特丹(02:00)创建了2017-10-26T10:11:54.

您的默认时区可能是使用01:00偏移的时区,这可以解释您所得到的差异(12:11 UTC首先转换为13:11的LocalDateTime,然后toDateTime在Amsterdam创建13:11).

JSR310-新的日期/时间API

Joda-Time处于维护模式,并且已被新的API取代,因此,我不建议使用它来启动新项目.即使在joda’s website年,它也表示:“请注意,Joda-Time被认为是一个很大程度上“完成”的项目.没有计划进行重大增强.如果使用Java SE 8,请迁移到java.time(JSR-310).”.

如果您不能(或不想)从Joda-Time迁移到新的API,则可以忽略此部分.

在Android中,您可以使用ThreeTen Backport,它是Java 8’s new date/time classes的一个很好的反向端口.要使其正常工作,您还需要ThreeTenABP(有关如何使用它的更多信息here).

要从epochTime获取相应的UTC时刻,可以使用org.threeten.bp.Instant类.然后,您使用org.threeten.bp.ZoneId将其转换为时区,从而产生org.threeten.bp.ZonedDateTime:

val dateServer = Instant.ofEpochSecond(epochTime).atZone(ZoneId.of("Europe/Amsterdam"));

dateServer将是org.threeten.bp.ZonedDateTime,其值对应于2017-10-26T14:11:54 02:00 [Europe / Amsterdam].

标签:timezone,jodatime,kotlin,datetime,android
来源: https://codeday.me/bug/20191025/1929806.html