Java 乔达时间1900期

Java 乔达时间1900期,java,jodatime,Java,Jodatime,date是1900-01-01 DateTimeFormatter fmt = ISODateTimeFormat.date(); return fmt.withZone(DateTimeZone.forTimeZone(zone)).print(date.getTime()); 输出为1899-12-31。为什么会出现这种错误?如何修复它?java的Date和joda的DateTime在1900-01-01有30分钟的差异。(java.sql.Date是java.util.Date的子类)

date
1900-01-01

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

输出为
1899-12-31
。为什么会出现这种错误?如何修复它?

java的
Date
和joda的
DateTime
1900-01-01
有30分钟的差异。(
java.sql.Date
java.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);

java的
Date
和joda的
DateTime
1900-01-01
有30分钟的差异。(
java.sql.Date
java.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);

那么,什么是
区域
?它可能是格林尼治标准时间减去一些东西,这就是为什么你要返回一天的原因。那么,什么是
区域
?它可能是GMT减去某个值,这就是为什么要返回一天。日期是java.sql.date。如果是时区差异,为什么所有其他日期打印都正确?@user1693380您使用哪个时区?jdk date和joda datetime都使用+8时区。有人说有这个问题。但不是在datetimeformatter中。日期是java.sql.date。如果是时区差异,为什么所有其他日期打印都正确?@user1693380您使用哪个时区?jdk date和joda datetime都使用+8时区。有人说有这个问题。但不是在datetimeformatter中。