gpt4 book ai didi

java - Joda - 如何在不忽略时区的情况下比较两个 DateTime 对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:59:09 24 4
gpt4 key购买 nike

我很难比较在不同时区的两个 DateTime 对象。

我已经知道的:

1) 我知道 "isBefore()" 方法将时区考虑在内。因此,下面的“如果”条件不成立(尽管我希望它成立):

long aRandomTimeSinceTheEpoch = 1234567789L;

String TIMEZONE_SYDNEY_AUSTRALIA = "Australia/Sydney";
DateTimeZone sydneyTimeZone = DateTimeZone.forID(TIMEZONE_SYDNEY_AUSTRALIA);
Chronology chronologySydney = GJChronology.getInstance(sydneyTimeZone);

String TIMEZONE_NEWYORK = "America/New_York";
DateTimeZone newYorkTimeZone = DateTimeZone.forID(TIMEZONE_NEWYORK);
Chronology chronologyNewYork = GJChronology.getInstance(newYorkTimeZone);

DateTime sydneyDateTime = new DateTime(aRandomTimeSinceTheEpoch, chronologySydney);
DateTime newYorkDateTime = new DateTime(aRandomTimeSinceTheEpoch, chronologyNewYork);

if( newYorkDateTime.isBefore(sydneyDateTime) ){
System.out.println("true");
}

2) 基于这个答案 ( https://stackoverflow.com/a/8793980 ),似乎正确的方法是使用 Period 来代替,因为 Period 是我想要做的事情的正确概念。但是,该代码有时会抛出 “UnsupportedOperationException - 如果期间包含年或月” 异常(因为我正在处理彼此相差最多 2 年的日期)。

简而言之,我想要的只是一个将时区考虑在内的“isBefore()”方法。(并且不会像上面那样抛出异常)。我如何在 Joda 中实现这一目标?

最佳答案

您缺少的是任何时候您从纪元开始以秒或毫秒为单位进行测量 - 始终采用 UTC。

因此您的 sydneyDateTimenewYorkDateTime 可能有不同的时区,但由于它们都源自相同的 aRandomTimeSinceTheEpoch 值,因此它们都会出现在同一时刻。因此,两者都先于

打个比方,就像问1英寸和2.54厘米哪个大?

从您的评论来看,您似乎想要比较每个时区的本地时间,您可以这样做:

if( newYorkDateTime.toLocalDateTime().isBefore(sydneyDateTime.toLocalDateTime()) )

请注意,如果您始终从同一源瞬间开始,那么此值将始终为真。就像 2.54 总是大于 1 一样。

关于java - Joda - 如何在不忽略时区的情况下比较两个 DateTime 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18304105/

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