gpt4 book ai didi

java - 我的问题是关于从 groovy 中的日期转换纪元毫秒

转载 作者:行者123 更新时间:2023-12-02 03:47:06 26 4
gpt4 key购买 nike

我使用以下代码生成以毫秒为单位的纪元时间戳,它可以工作(使用 https://www.epochconverter.com/ 进行验证)。但是,当我们使用 JVM 选项 -Duser.timezone=America/Toronto 设置时区时,对于某些历史日期,时间偏移量会相差一小时。即 Date=1950-11-19 (yyyy-MM-dd) 正确的纪元毫秒 -603313200000 (星期日,1950 年 11 月 19 日 12:00:00 AM GMT-05:00),但是当使用 JVM 选项设置时区时,值为 - 603316800000 和 Epoch 转换显示 1950 年 11 月 18 日星期六 11:00:00 PM GMT-05:00。我已将 joda time lib 与 JDK 10 一起使用

def static Long getEpochTimeStampInMilliSeconds(String simpleDate, String dateFormat) {

Long retVal = null

try {
org.joda.time.format.DateTimeFormatter fmt = DateTimeFormat.forPattern(dateFormat)
DateTimeZone dtz2 = DateTimeZone.forID("America/Toronto")
DateTime parsedDateTime = DateTime.parse(simpleDate, fmt).withZone(dtz2)
retVal = parsedDateTime.getMillis()
} catch (Exception e) {
retVal = null
}

return retVal
}

日期格式为:“yyyy-MM-dd”

最佳答案

您需要使用正确的时区进行解析,因此不要调用 dateTime.withZone(...)解析完成后,需要调用dateTimeFormatter.withZone(...)在使用格式化程序进行解析之前。

如果 user.timezone 系统属性设置的默认时区是 America/Toronto,则解析后的 DateTime 值为已经在该时区,并且 dateTime.withZone(...) 将不执行任何操作。

如果默认时区是其他时区,则解析的 DateTime 值位于该时区,这将是不同的 UTC 纪元毫秒值。调用 dateTime.withZone(...) 将更改时区,从而更改时间值,但不会更改 UTC 纪元毫秒值。

def dtz2 = org.joda.time.DateTimeZone.forID("America/Toronto")
def fmt = org.joda.time.format.DateTimeFormat.forPattern(dateFormat).withZone(dtz2)
retVal = org.joda.time.DateTime.parse(simpleDate, fmt).getMillis()
<小时/>

更新

来自comment :

I am receiving -603316800000 for 1950-11-19 for all scenario but correct value is -603313200000

让我们使用 Java-Time API 测试哪个值是正确的:

ZoneId zone = ZoneId.of("America/Toronto");
System.out.println(Instant.ofEpochMilli(-603316800000L));
System.out.println(Instant.ofEpochMilli(-603316800000L).atZone(zone));
System.out.println(Instant.ofEpochMilli(-603313200000L));
System.out.println(Instant.ofEpochMilli(-603313200000L).atZone(zone));

输出

1950-11-19T04:00:00Z
1950-11-19T00:00-04:00[America/Toronto] ⬅ Correct value
1950-11-19T05:00:00Z
1950-11-19T01:00-04:00[America/Toronto]

如您所见,您获得的值 (-603316800000) 是多伦多时间 1950 年 11 月 19 日午夜的正确值。

多伦多的偏移量为 -04:00,因为在 1950 年,DST 一直持续到 11 月 26 日星期日凌晨 2:00(请参阅 https://www.timeanddate.com/time/zone/canada/toronto ),因此东部夏令时间 (EDT) 的偏移量是正确的。

不知道为什么您认为 -603313200000 是正确的值,但事实并非如此。

关于java - 我的问题是关于从 groovy 中的日期转换纪元毫秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56798072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com