今天心血来潮看了一下 integer的 compareTo 的源码 发现 最后 他会归到一列
return (x < y) ? -1 : ((x == y) ? 0 : 1);
这样的一个比较
然后又看了一下 LocalDateTime的比较 ps(这个类型比较 必须用"yyyy-MM-dd HH:mm:ss.S" 这个格式)
if (other instanceof LocalDateTime) {
return compareTo0((LocalDateTime) other);
}
return ChronoLocalDateTime.super.compareTo(other);
会再次转化为LocalDateTime 这个对象
用这个对象ChronoLocalDateTime 来进行比较 我看 代码中的解释是 官方鼓励鼓励使用LocalDateTime而不是此接口,即使在应用程序需要处理多个日历系统的情况下也是如此。
也没懂这个为什么要这样要求。
int cmp = toLocalDate().compareTo(other.toLocalDate());
if (cmp == 0) {
cmp = toLocalTime().compareTo(other.toLocalTime());
if (cmp == 0) {
cmp = getChronology().compareTo(other.getChronology());
}
}
return cmp;
然后 就进入到了 这个里面
toLocalDate() 返回与该日期时间相同的年,月和日的本地日期。
toLocalTime() 与该日期时间相同的小时,分钟,秒和纳秒的本地时间。
就是先比较 年月日 不能比较的话 在比较 时分秒以及纳秒
int cmp = Long.compare(toEpochDay(), other.toEpochDay());
if (cmp == 0) {
cmp = getChronology().compareTo(other.getChronology());
}
return cmp;
比较 年月日时分秒时 都是转化为 long的 比较了 而long的话 和integer的比较相差不大 准确的说 一样的 毕竟都是数字比较
如果这样还不行的话 那就使用下面的方法了
getChronology() 获取此日期时间的时间顺序。
年表代表正在使用的日历系统。 ChronoField中的纪元和其他字段由年表定义。
这个 应该就是显示的你本地时区了 应该就是根据时区比较了。
因为 咳咳 我不知道其他时区的就显示一下 这边的输出结果吧 都是iso
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
这就是 最后的最后了 哈哈 最终 他就回到了 string 字符串比较的 方法中