Android Joda DateTime时区不';我不能正确地出现

Android Joda DateTime时区不';我不能正确地出现,android,datetime,timezone,kotlin,jodatime,Android,Datetime,Timezone,Kotlin,Jodatime,我正在Android中使用Joda TimeDateTime 似乎DateTimeZone无法正常工作。也许这和夏令时有关 目前,我们有GMT+2。这将在几周内改变,因为冬天。然后它将是GMT+1。但现在这是不正确的 import org.joda.time.DateTime import org.joda.time.DateTimeZone import org.joda.time.LocalDateTime // GMT: Thursday 26 October 2017 12:11:54

我正在Android中使用Joda Time
DateTime

似乎
DateTimeZone
无法正常工作。也许这和夏令时有关

目前,我们有GMT+2。这将在几周内改变,因为冬天。然后它将是GMT+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+夏令时02:00

实际:

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


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

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

如果要获取特定时区中对应于
epochTime
的日期和时间,只需:

这样,
dateServer
将:

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


我的默认时区中有一个例子,更清楚一点。我的默认时区(由
DateTimeZone.getDefault()
返回)是
美国/圣保罗
,它使用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
。因此它在阿姆斯特丹创建了
2017-10-26T10:11:54
+02:00

您的默认时区可能是使用
+01:00
偏移量的时区,这可以解释您得到的差异(UTC 12:11首先转换为
LocalDateTime
,时间为13:11,然后
toDateTime
在阿姆斯特丹创建13:11)


JSR310-新的日期/时间API Joda Time处于维护模式,正在被新的API所取代,因此我不建议使用它启动新项目。甚至在文章中也提到:“请注意,Joda Time被认为是一个基本上“完成”的项目。没有计划进行重大的增强。如果使用Java SE 8,请迁移到Java.Time(JSR-310)。”

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

在Android中,您可以使用,这是一个非常好的后台端口。要使它工作,您还需要(更多关于如何使用它的信息)

要从
epochTime
获取相应的UTC瞬间,可以使用
org.threeten.bp.instant
类。然后使用
org.threeten.bp.ZoneId
将其转换为时区,从而生成
org.threeten.bp.zoneDateTime

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

dateServer
将是一个
org.threeten.bp.ZonedDateTime
,其值对应于
2017-10-26T14:11:54+02:00[欧洲/阿姆斯特丹]

DateTimeZone.getDefault()的值是多少?
val dateServer = Instant.ofEpochSecond(epochTime).atZone(ZoneId.of("Europe/Amsterdam"));