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

时间:2019-06-27 20:26:09

标签: java spring-boot groovy

我正在使用以下代码生成以毫秒为单位的纪元时间戳,它可以工作(已通过https://www.epochconverter.com/验证)。但是,当我们使用JVM选项-Duser.timezone = America / Toronto设置时区时,对于某些历史日期,时间偏移量相差一小时。即Date = 1950-11-19(yyyy-MM-dd)正确的时间毫秒-603313200000(星期日,1950年11月19日,格林尼治标准时间-05:00,格林尼治标准时间05:00),但是当使用JVM选项设置时区时,值为- 603316800000和大纪元转换后的结果是,格林尼治标准时间-05:00,1950年11月18日星期六,11:00:00。我在JDK 10中使用了joda time lib

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”

1 个答案:

答案 0 :(得分:0)

您需要使用正确的时区进行解析,因此您无需在解析完成后调用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

  

我在所有情况下都收到1950-11-19的-603316800000,但正确值为-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年,夏令时一直持续到11月26日,星期日,凌晨2:00(请参阅https://www.timeanddate.com/time/zone/canada/toronto),因此偏移量对于东部夏令时(EDT)是正确的

不知道为什么您认为-603313200000是正确的值,但不是。