Chr*_*hro 5 java datetime jodatime date-difference java-time
计算使用Joda-Time 之间的天数1900-01-01和日期之间的天数1918-03-24似乎给出了一个一个接一个的结果.
使用Java 8可以java.time得到正确的结果.Joda-Time不计算的原因是什么1918-03-25?
使用Joda-time v2.9.9.
public static void main(String[] args) {
jodaDiff("1918-03-24");
javaDiff("1918-03-24");
jodaDiff("1918-03-25");
javaDiff("1918-03-25");
jodaDiff("1918-03-26");
javaDiff("1918-03-26");
jodaDiff("2017-10-10");
javaDiff("2017-10-10");
}
private static void jodaDiff(String date) {
DateTime start = new DateTime(1900, 1, 1, 0, 0, 0, DateTimeZone.forID("UTC"));
DateTimeFormatter dateDecoder = DateTimeFormat.forPattern("YYYY-MM-dd");
DateTime end = dateDecoder.parseDateTime(date);
int diff = Days.daysBetween(start, end).getDays();
System.out.println("Joda " + date + " " + diff);
}
private static void javaDiff(String date) {
LocalDate start = LocalDate.parse("1900-01-01");
LocalDate end = LocalDate.parse(date);
int diff = (int) ChronoUnit.DAYS.between(start, end);
System.out.println("Java " + date + " " + diff + "\n");
}
Run Code Online (Sandbox Code Playgroud)
输出:
Joda 1918-03-24 6656
Java 1918-03-24 6656Joda 1918-03-25 6656
Java 1918-03-25 6657Joda 1918-03-26 6657
Java 1918-03-26 6658Joda 2017-10-10 43015
Java 2017-10-10 43016
问题是您DateTimeFormatter正在使用系统默认时区.理想情况下,您应该解析LocalDate值而不是DateTime,但您可以通过使用UTC格式化器来修复它:
DateTimeFormatter dateDecoder = DateTimeFormat.forPattern("YYYY-MM-dd").withZoneUTC();
Run Code Online (Sandbox Code Playgroud)
要LocalDate改为解析,只需使用:
org.joda.time.LocalDate start = new org.joda.time.LocalDate(1900, 1, 1);
DateTimeFormatter dateDecoder = DateTimeFormat.forPattern("YYYY-MM-dd");
org.joda.time.LocalDate end = dateDecoder.parseLocalDate(date);
Run Code Online (Sandbox Code Playgroud)
(如果你不使用Java 8,显然你不需要完全限定它.)
| 归档时间: |
|
| 查看次数: |
352 次 |
| 最近记录: |