乔达时间1900年问题

时间:2013-07-16 03:57:06

标签: java jodatime

date1900-01-01

DateTimeFormatter fmt = ISODateTimeFormat.date();
return fmt.withZone(DateTimeZone.forTimeZone(zone)).print(date.getTime());

输出为1899-12-31。为什么这个错误?如何解决?

1 个答案:

答案 0 :(得分:3)

java 1900-01-01和joda Date之间的DateTime差异为30分钟。 (java.sql.Datejava.util.Date)的子类

所以,这不是格式化程序问题。调查以下代码并检查输出:

Date javaDate = new SimpleDateFormat("yyyy-MM-dd").parse("1900-01-01");
System.out.printf("%s,  %d\n", javaDate, javaDate.getTime());

DateTime jodaDate1 = new DateTime(1900, 1, 1, 0, 0, 0);
System.out.printf("%s, %d\n", jodaDate1, jodaDate1.getMillis());

DateTime jodaDate2 = new DateTime(javaDate.getTime());
System.out.printf("%s,  %d\n", jodaDate2, jodaDate2.getMillis());

检查输出时,可以看到相同的毫秒值表示为不同的日期。如果将日期更改为1900-01-02,则日期及其毫秒值将相同。

因此,您似乎应该从java的Date中提取每个字段,并使用字段值创建一个joda的DateTime实例,如下所示:

Calendar cal = Calendar.getInstance();
cal.setTime(javaDate);
DateTime dt = new DateTime(cal.get(Calendar.YEAR), 
                           cal.get(Calendar.MONTH)+1,
                           cal.get(Calendar.DATE), 0, 0, 0);