jbr*_*own 1 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
Run Code Online (Sandbox Code Playgroud)
这个小时偏移量来自哪里,我该如何摆脱它?我的本地时区是格林威治标准时间(无论如何目前都为 UTC)...
显然,它不是用 GMT/UTC 解析的。只需将其添加到您的DateTimeFormat.
DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss").withZoneUTC()
Run Code Online (Sandbox Code Playgroud)
Sotirios Delimanolis 的答案是正确的。下面是 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 ();
Run Code Online (Sandbox Code Playgroud)
转储到控制台。
System.out.println ( "input: " + input + " | zdt: " + zdt + " | secondsFromEpoch: " + secondsFromEpoch );
Run Code Online (Sandbox Code Playgroud)
输入:2015 年 10 月 10 日 10:00:00 | zdt: 2015-10-10T10:00Z | 来自纪元的秒数:1444471200