当前位置: 首页 > 知识库问答 >
问题:

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

归建安
2023-03-14

我正在用以下代码生成以毫秒为单位的历元时间戳,它可以工作(通过https://www.epochconverter.com/验证)。但是,当我们使用JVM选项-duser.timezone=america/toronto设置时区时,对于某些历史日期,时间偏移量会相差一小时。即日期=1950-11-19(yyyy-MM-dd)正确的历元毫秒-603313200000(星期日,1950年11月19日12:00:00 AM GMT-05:00),但当用JVM选项设置时区时,值为-603316800000,历元转换后显示1950年11月18日星期六11:00:00 PM GMT-05:00。我在JDK10中使用了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个答案

景宏富
2023-03-14

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

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

不知道为什么你认为-603313200000是正确的值,其实不然。

 类似资料:
  • 问题内容: 我有一个等于日期的字符串,表示为自Unix纪元以来的毫秒数。 我正在尝试将其输出到dmY。 我得到的字符串是“ 1227643821310”,并被告知结果应等于 2-12-2008 ,但我不断得到的结果是 25-11-2008 我的代码如下: 关于为什么会这样的任何想法? 问题答案: 您已经做对了,1227643821根本不是2008年12月12日,的确是2008年11月25日。

  • 问题内容: 我对当前UTC时间以毫秒为单位不感兴趣,也无需弄乱时区。我的原始日期已经存储为UTC时间戳。 我在UTC时间“ 2012-06-14 05:01:25”中存储了一个日期。我对日期时间不感兴趣,但对日期部分感兴趣。因此,在用Java检索日期并排除小时,分钟和秒之后,我剩下的是“ 2012-06-14”。 如何将其转换为UTC毫秒? 问题答案: 编辑:我错过了“忽略一天中的时间”部分。它现

  • 我将calendar.getTimeinMilliseconds()中的日期存储在SQLite DB中。我需要在SELECT语句中标记每个月的第一行,所以我只需要使用SQLite函数将时间以毫秒为单位转换为任何日期格式。我怎样才能避免这个?

  • 本文向大家介绍从日期中删除秒/毫秒并转换为ISO字符串?,包括了从日期中删除秒/毫秒并转换为ISO字符串?的使用技巧和注意事项,需要的朋友参考一下 首先让我们获取当前日期- 现在,让我们使用-将秒/毫秒设置为0,以删除秒/毫秒: 使用-转换为ISO字符串- 现在让我们看到带有输出的完整代码- 示例 要运行以上程序,您需要使用以下命令- 在这里,我的文件名为demo143.js。 输出结果 这将产生

  • 问题内容: 如何将将来的日期(例如2012年2月17日星期六)转换为毫秒数,然后从java中的当前时间中减去该毫秒数,从而得出到该未来日期为止的剩余时间。 问题答案: 最简单的技术是使用: 一种更困难的技术(基本上可以为您做些什么)涉及您自己解析(这 不会 被视为 最佳实践 ):

  • 我希望能够将日期字符串(如“2019年9月23日”)转换为dart中的毫秒