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