将日期时间转换为在Java / scala中丢失一小时的纪元时间

时间:2015-11-05 16:53:31

标签: java scala jodatime

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

java.time

Sotirios Delimanolis的Answer是正确的。以下是Java 8及更高版本中内置的java.time框架的相同类型的代码,旨在作为Joda-Time的后续版本。

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

然后我们调用parse上的静态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 );
  

输入:10/10/2015 10:00:00 | zdt:2015-10-10T10:00Z | secondsFromEpoch:14444712​​00