【问题标题】:Converting date time to epoch time losing an hour in Java/scala在 Java/scala 中将日期时间转换为纪元时间损失一小时
【发布时间】:2015-11-05 16:53:30
【问题描述】:

我正在尝试将日期时间字符串 10/10/2015 10:00:00 转换为自 unix 纪元以来的秒数,即 1444471200。然而,奇怪的是我得到了1444467600 的值,实际上是10/10/2015 09:00:00。这是我的代码:

// using "joda-time" % "joda-time" % "2.9",
//       "org.joda" % "joda-convert" % "1.8.1",

import org.joda.time.DateTime
import org.joda.time.format.DateTimeFormat

val dt = DateTime.parse(dateTimeString, DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss"))
dt.getMillis / 1000

这个小时偏移量来自哪里,我该如何摆脱它?我的本地时区是格林威治标准时间(目前 == UTC)...

【问题讨论】:

  • 我怀疑您的本地时区实际上是欧洲/伦敦,而不是格林威治标准时间。他们非常不同。 10 月 10 日,欧洲/伦敦时间为 UTC+1...
  • @JonSkeet 好点。你是对的。现在欧洲/伦敦是 UTC。我正在使用 python 来仔细检查我的值,所以我想那是在给不知道 TZ 的日期。谢谢。
  • 这里要学习的教训是在序列化日期时间值时始终包含与 UTC 的偏移量。更好的是,坚持使用ISO 8601 标准格式。
  • @BasilBourque 正确。不幸的是,这是第三方数据:-(

标签: java scala jodatime


【解决方案1】:

显然,它不是用 GMT/UTC 解析的。只需将其添加到您的DateTimeFormat

DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss").withZoneUTC()

【讨论】:

    【解决方案2】:

    java.time

    Sotirios Delimanolis 的Answer 是正确的。这是 Java 8 及更高版本中内置的 java.time 框架的相同代码,旨在作为 Joda-Time 的继承者。

    首先我们定义一个格式化程序。注意调用链,调用withZone 来指定我们想要解析字符串的区域。这不是可选的,因为输入字符串缺少偏移量或时区数据。

    然后我们调用ZonedDateTime上的静态parse方法来实际进行解析。

    最后,我们调用便捷方法toEpochSecond 将此日期时间转换为从 1970-01-01T00:00:00Z 开始的秒数。

    String input = "10/10/2015 10:00:00";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MM/dd/yyyy HH:mm:ss" ).withZone ( ZoneOffset.UTC );
    ZonedDateTime zdt = ZonedDateTime.parse ( input , formatter );
    long secondsFromEpoch = zdt.toEpochSecond ();
    

    转储到控制台。

    System.out.println ( "input: " + input + " | zdt: " + zdt + " | secondsFromEpoch: " + secondsFromEpoch );
    

    输入:2015 年 10 月 10 日 10:00:00 | zdt: 2015-10-10T10:00Z | secondsFromEpoch:14444712​​00

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-06
      • 2011-12-13
      • 2018-04-24
      • 2011-12-06
      • 2010-12-14
      • 2021-03-25
      • 2018-10-01
      • 2012-11-08
      相关资源
      最近更新 更多