将日期时间转换为纪元时间在 Java/scala 中损失了一个小时

Converting date time to epoch time losing an hour in Java/scala

我正在尝试将日期时间字符串 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)...

显然,它没有使用 GMT/UTC 进行解析。只需将其添加到您的 DateTimeFormat.

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

java.time

by Sotirios Delimanolis is correct. Here is the same kind of code for the java.time framework built into Java 8 and later, intended as the successor to Joda-Time.

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

然后我们调用静态 parse method on ZonedDateTime 来实际进行解析。

最后我们调用便捷方法 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 );

input: 10/10/2015 10:00:00 | zdt: 2015-10-10T10:00Z | secondsFromEpoch: 1444471200