我只想比较两个org.joda.time.DateTime
值的日期,所以我使用的是DateTimeComparator.getDateOnlyInstance()
- 但我看到了一些与其javadoc不匹配的行为。我想知道这里有人可以解释一下。 javadoc of DateTimeComparator对其参数和返回值说明如下:
Parameters:
lhsObj - the first object, logically on the left of a < comparison, null means now
rhsObj - the second object, logically on the right of a < comparison, null means now
Returns:
zero if order does not matter, negative value if lhsObj < rhsObj, positive value otherwise.
问题1:为什么会返回zero if order does not matter
。 Comparator interface's javadoc中定义的此方法的合同表明返回值应为a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second
。 (我突然意识到order does not matter
可能是作者说对象是平等的方式,但这是一种令人困惑的方式。)
问题2:请考虑以下代码及其输出:
public static void main(String[] args) {
DateTime nowUTC = DateTime.now(DateTimeZone.UTC);
int comparisonResult = DateTimeComparator.getDateOnlyInstance().compare(null, nowUTC);
System.out.println("comparisonResult = " + comparisonResult);
}
输出(请记住 null表示现在,而仅表示日期应该比较):
comparisonResult = -1
=== 阅读第一个答案和更多实验后的其他信息:
同意null
表示&#34;现在处于默认系统时区&#34;但如果您比较DateTime.now(DateTimeZone.UTC)
和null
的整个日期时间值,则它们是相同的(请参阅下面的其他代码)。这对我来说似乎是对的,因为现在在任何时区都是同一时刻。但是,各个领域可能不同。所以,昨天,我只比较日期与UTC和PST(我的默认系统时区)不同时的日期,我得到了预期结果= 1,因为UTC中的日期更长。此时,尽管两个区域的日期相同,但比较器似乎表示UTC中的日期比PST中的日期更少,这是绝对不可能的。
测试代码:
public static void main(String [] args){
System.out.println("Printing DateTime.now(DateTimeZone.UTC), and (DateTime)null using formatter.withZoneUTC()");
System.out.println("\tDateTime.now(DateTimeZone.UTC)\t= " +
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss-z").withZoneUTC().print(DateTime.now(DateTimeZone.UTC)));
System.out.println("\t(DateTime)null\t\t\t= " +
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss-z").withZoneUTC().print((DateTime)null));
System.out.println();
System.out.println("Printing (DateTime)null using formatter with default timezone");
System.out.println("\t(DateTime)null\t\t\t= " + DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss-z").print((DateTime)null));
System.out.println();
System.out.println("Comparing date only of DateTime.now(DateTimeZone.UTC) (LHS) and null (RHS)");
int dateOnlyComparisonResult = DateTimeComparator.getDateOnlyInstance().compare(DateTime.now(DateTimeZone.UTC), null);
System.out.println("\tdateOnlyComparisonResult\t= " + dateOnlyComparisonResult);
System.out.println();
System.out.println("Comparing entire date time value of DateTime.now(DateTimeZone.UTC) and null");
int instantComparisonResult = DateTimeComparator.getInstance().compare(DateTime.now(DateTimeZone.UTC), null);
System.out.println("\tinstantComparisonResult\t\t= " + instantComparisonResult);
}
输出:
Printing DateTime.now(DateTimeZone.UTC), and (DateTime)null using formatter.withZoneUTC()
DateTime.now(DateTimeZone.UTC) = 2016-02-11T19:26:07-UTC
(DateTime)null = 2016-02-11T19:26:08-UTC
Printing (DateTime)null using formatter with default timezone
(DateTime)null = 2016-02-11T11:26:08-PST
Comparing date only of DateTime.now(DateTimeZone.UTC) (LHS) and null (RHS)
dateOnlyComparisonResult = -1
Comparing entire date time value of DateTime.now(DateTimeZone.UTC) and null
instantComparisonResult = 0
答案 0 :(得分:1)
回答问题1:
我同意“如果命令无关紧要”这一短语令人困惑。如果时间对象相等或类似,则可以更好地替换为“零”。您可以在Joda-Time的github-location上发布问题甚至拉取请求,以建议您的首选描述。
回答问题2:
Null
值并不仅仅意味着现在,而是现在在默认系统时区。所以只有以下代码可以运行:
DateTime nowDefaultZone = DateTime.now(DateTimeZone.getDefault());
int comparisonResult =
DateTimeComparator.getDateOnlyInstance().compare(null, nowDefaultZone);
System.out.println("comparisonResult = " + comparisonResult); // 0
无论如何,我强烈建议不要使用此null-“feature”,但指定明确的时区引用,因为将null
解释为与“now”相关的任何内容本身并不直观。