Joda DateTime 输出与 gmt 的意外差异
Joda DateTime output unexpected difference from gmt
我的代码:
val pattern = "MM-dd-yy"
val t = DateTime.parse("07-01-86", DateTimeFormat.forPattern(pattern)).toDateTime(DateTimeZone.forID("GMT"))
val z = t.getMillis.asInstanceOf[Long]
println("ms= "+z) // expected output: 520560000000 actual output: 520578000000
几个在线 GMT 日期转换器提供与 DateTime 不同的毫秒输出。有人知道为什么吗?
在您的解决方案中,您的 本地时区 在解析日期时间时被隐式使用。你应该使用
val t = DateTime.parse("07-01-86", DateTimeFormat.forPattern(pattern).withZoneUTC())
强制在 UTC 时区中创建 DateTime
。那么,毫秒就是520560000000
。无需再对其执行 toDateTime(DateTimeZone)
。
否则,用你的构造
val t = DateTime.parse("07-01-86", DateTimeFormat.forPattern(pattern)).toDateTime(DateTimeZone.forID("GMT"))
DateTime
将首先在您的本地 TZ 中创建(即 您的[=38= 中的 07-01-86 的 午夜 ] TZ) 然后 "cast" 到 UTC,但保留时间戳(即,它将是相同的时间戳,但以 UTC 解释,因此时间部分和日期部分将根据您当地的 TZ 偏移量而变化)。
例子(我的TZ是+02:00):
DateTime.parse("07-01-86", DateTimeFormat.forPattern(pattern)) // --> 1986-07-01 00:00 (+02:00)
.toDateTime(DateTimeZone.forID("GMT")) // --> 1986-06-30 22:00 (UTC)
我假设你可以使用 UTC
而不是 GMT
但还有
DateTimeFormat.forPattern(pattern).withZone(...)
在那里你可以提供你想要的区域。
我的代码:
val pattern = "MM-dd-yy"
val t = DateTime.parse("07-01-86", DateTimeFormat.forPattern(pattern)).toDateTime(DateTimeZone.forID("GMT"))
val z = t.getMillis.asInstanceOf[Long]
println("ms= "+z) // expected output: 520560000000 actual output: 520578000000
几个在线 GMT 日期转换器提供与 DateTime 不同的毫秒输出。有人知道为什么吗?
在您的解决方案中,您的 本地时区 在解析日期时间时被隐式使用。你应该使用
val t = DateTime.parse("07-01-86", DateTimeFormat.forPattern(pattern).withZoneUTC())
强制在 UTC 时区中创建 DateTime
。那么,毫秒就是520560000000
。无需再对其执行 toDateTime(DateTimeZone)
。
否则,用你的构造
val t = DateTime.parse("07-01-86", DateTimeFormat.forPattern(pattern)).toDateTime(DateTimeZone.forID("GMT"))
DateTime
将首先在您的本地 TZ 中创建(即 您的[=38= 中的 07-01-86 的 午夜 ] TZ) 然后 "cast" 到 UTC,但保留时间戳(即,它将是相同的时间戳,但以 UTC 解释,因此时间部分和日期部分将根据您当地的 TZ 偏移量而变化)。
例子(我的TZ是+02:00):
DateTime.parse("07-01-86", DateTimeFormat.forPattern(pattern)) // --> 1986-07-01 00:00 (+02:00)
.toDateTime(DateTimeZone.forID("GMT")) // --> 1986-06-30 22:00 (UTC)
我假设你可以使用 UTC
而不是 GMT
但还有
DateTimeFormat.forPattern(pattern).withZone(...)
在那里你可以提供你想要的区域。