Android Joda DateTime时区不';我不能正确地出现
我正在Android中使用Joda TimeAndroid 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
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对应于UTC2017-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"));