Joda Time从MutableDateTime实例中减去24小时,我想知道原因

kg.*_*kg. 5 java timezone jodatime

我不明白为什么MutableDateTime.setDate()将时间设置为"昨天"(参见日志时间戳小时 - 它是20:28).这个时区有关系吗?我需要在格式化程序上设置一些东西吗?

我希望在使用"10/27/2010"调用setDate之后,日期将与解析日期00:00 EDT 10/27/10相同,而不是20/28 EDT 10/26/10.这是24小时前从"now".

我在这里缺少什么,或者我应该如何编辑代码以获得所需的结果?我是Joda Time的新手,想解开这个谜.

DateTimeFormatter dateFormatterJ = DateTimeFormat.forPattern("MM/dd/yyyy");
DateTimeFormatter timestampFormatJ = DateTimeFormat.forPattern("HH:mm zzz MM/dd/yy");

MutableDateTime startDate = new MutableDateTime();

log.info("parsed date " + 
    timestampFormatJ.print(dateFormatterJ.parseMutableDateTime(startDateString)));

startDate.setDate((dateFormatterJ.parseMutableDateTime(startDateString)));

log.info("startDate: " + timestampFormatJ.print(startDate));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,startDateString只是"10/27/2010".

这是日志输出:

10-27 20:28:55 INFO parsed date: 00:00 EDT 10/27/10
10-27 20:28:55 INFO startDate: 20:28 EDT 10/26/10
Run Code Online (Sandbox Code Playgroud)

谢谢

Jod*_*hen 2

解析不包含 GMT 偏移量或时区 ID 的字符串时,必须执行以下三项操作之一:

  • 不执行任何操作,并接受在默认时区解析字符串
  • withZone()指定在格式化程序上使用时要解析的时区
  • 使用parseLocalDate()而不是parseMutableDateTime()

最后一个是首选解决方案,因为它可以正确解析实际输入的数据,即没有时间、偏移量或区域的日期。

在测试代​​码中使用parseLocalDate()可以正确解析日期。