gpt4 book ai didi

java - Joda Time 从 MutableDateTime 实例中减去 24 小时,我想知道为什么

转载 作者:搜寻专家 更新时间:2023-10-31 19:58:35 25 4
gpt4 key购买 nike

我不明白为什么 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com