Joda DateTime时区没有正确显示

时间:2017-10-26 12:38:33

标签: android datetime timezone kotlin jodatime

我在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 GMT + 02:00 DST

实际值:

  

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

1 个答案:

答案 0 :(得分:4)

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

然后,toDateTime方法会创建一个DateTime,该LocalDateTime对应于epochTime所代表的相同日期和时间,但是在指定的时区(它只是"附加&#34) ;时区到日期/时间值,并且没有进行转换。)

如果您想获得与特定时区val dateServer = DateTime(epochTime * 1000, DateTimeZone.forID("Europe/Amsterdam")); 对应的日期和时间,请create the DateTime directly

dateServer

有了这个,DateTimeZone.getDefault()将是:

  

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

我的默认时区中的一个示例,为了更清楚。我的默认时区(由America/Sao_Paulo返回)为-02:00,在2017年10月26日 th 使用偏移epochTime(比UTC晚2小时)。

2017-10-26T12:11:54Z 1509019914对应于UTC LocalDateTime(epochTime * 1000)

当我LocalDateTime时,它获得相应的UTC值(12:11)并转换为默认时区:在我的情况下,到10:11,所以2017-10-26T10:11:54将具有该值toDateTime

然后,DateTime方法只会在指定的时区创建一个2017-10-26T10:11:54,该2017-10-26T10:11:54对应于相同的日期和时间(+02:00)。因此它在阿姆斯特丹创建+01:00LocalDateTime)。

您的默认时区可能是使用toDateTime偏移的时区,这可以解释您获得的差异(12:11 UTC首次转换为epochTime,时间为13:11,然后org.threeten.bp.Instant在阿姆斯特丹创造了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)。

要从org.threeten.bp.ZoneId获取相应的UTC时刻,您可以使用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]将是The build could not read 1 project -> [Help 1] The project com.deepit.springboot.example:spring-boot-in-deep:0.0.1-SNAPSHOT (~=NetBeansProjects\spring-boot-in-deep\pom.xml) has 1 error Non-resolvable parent POM: Could not transfer artifact org.springframework.boot:spring-boot-starter-parent:pom:2.0.0.BUILD-SNAPSHOT from/to spring-snapshots (https://repo.spring.io/snapshot): repo.spring.io and 'parent.relativePath' points at no local POM @ line 14, column 10: Unknown host repo.spring.io -> [Help 2] To see the full stack trace of the errors, re-run Maven with the -e switch. Re-run Maven using the -X switch to enable full debug logging. ,其值与a相对应。