我正在使用以下代码生成以毫秒为单位的纪元时间戳,它可以工作(已通过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”
答案 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是正确的值,但不是。