Joda DateTime输出与gmt的意外差异

时间:2015-08-31 03:03:18

标签: datetime jodatime 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不同的毫秒输出。谁知道为什么?

1 个答案:

答案 0 :(得分:0)

在您的解决方案中,在解析日期时间时会隐式使用本地时区。你应该使用

val t = DateTime.parse("07-01-86", DateTimeFormat.forPattern(pattern).withZoneUTC())

强制在UTC区域中创建DateTime。然后,millis是520560000000。无需再对其执行toDateTime(DateTimeZone)

否则,与您的构造

val t = DateTime.parse("07-01-86", DateTimeFormat.forPattern(pattern)).toDateTime(DateTimeZone.forID("GMT"))

DateTime将首先在您当地的TZ中创建(即您的 TZ中的午夜,然后是&#34) ;铸造"到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(...)

您可以在此处提供所需的区域。