- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我不明白为什么 MutableDateTime.setDate()
将时间设置为“昨天”(查看日志时间戳小时数 - 现在是 20:28)。这个时区相关吗?我需要在格式化程序上设置一些东西吗?
我希望在使用“10/27/2010”调用 setDate 后,日期将与解析日期 00:00 EDT 10/27/10 相同,而不是 20:28 EDT 10/26/10 .这是从“现在”算起的 24 小时前。
我在这里缺少什么,或者我应该如何编辑代码以获得所需的结果?我是 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));
在这种情况下,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
谢谢
最佳答案
简单的答案是,因为 javadoc 是这么说的。
public void setDate(ReadableInstantinstant)
Set the date from anotherinstant. The time part of this objectwill be unaffected.
Parameters:instant - an instant to copy the datefrom, time part ignored
Throws:IllegalArgumentException - if theobject is invalidobject is invalid
当 Joda 说“日期”时,它表示日期一词的人类含义。 “这个值的年-月-日部分”,不是 java.util.Date 的逻辑等价物。 (joda 的全部意义在于引入一些自然、合理的语义来处理日期和时间。)
编辑:要回答您的“如何修复”问题,只需执行以下操作:
MutableDateTime startDate = new MutableDateTime(dateFormatterJ.parseMutableDateTime(startDateString));
或者手动将时间部分归零。
编辑 2:嗯,我显然没有仔细阅读,这只是答案的一半。会检查。
编辑 3:好吧,这让我非常烦恼,所以我花了一分钟时间寻找它。
public void setDate(final ReadableInstant instant) {
long instantMillis = DateTimeUtils.getInstantMillis(instant);
Chronology instantChrono = DateTimeUtils.getInstantChronology(instant);
DateTimeZone zone = instantChrono.getZone();
if (zone != null) {
instantMillis = zone.getMillisKeepLocal(**DateTimeZone.UTC**, instantMillis);
}
setDate(instantMillis);
}
出于某种原因,它会在设置日期之前将您的绝对时间向前滚动到 UTC。所以你给它 10/27/2010 00:00 EDT 并将时间的绝对量级设置为代表 10/27/2010 00:00 UTC 的毫秒数,当然这只是前一天下午 6 点或 7 点.然后它发现该日期的 EDT 日期值为 10/26。
无法说明这是有意为之还是存在 2 年之久的错误。)
关于java - Joda Time 从 MutableDateTime 实例中减去 24 小时,我想知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4045561/
我有一个测试: @Test public void testJodaStartDate2a() { DateTime dateTime = new DateTime(2010,10,10,4,
我的代码的输出是0,0,0。我本来期待的是 0, -1 , 1 。代码中有什么问题?为什么我不能在 DateTime 中添加或减去秒? public static void main(String[]
我不明白为什么 MutableDateTime.setDate() 将时间设置为“昨天”(查看日志时间戳小时数 - 现在是 20:28)。这个时区相关吗?我需要在格式化程序上设置一些东西吗? 我希望在
我是一名优秀的程序员,十分优秀!