繁体   English   中英

在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

这个小时偏移量是从哪里来的,我该如何消除它? 我的本地时区是格林尼治标准时间(GMT)(无论如何,现在== UTC)...

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

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

java.time

Sotirios Delimanolis的答案是正确的。 这与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 );

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM