【问题标题】:joda time 1900 issue乔达时代1900问题
【发布时间】:2013-08-08 21:56:17
【问题描述】:

date1900-01-01

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

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

【问题讨论】:

  • 那么,zone 是什么?这可能是格林威治标准时间减去一些东西,这就是你要回去一天的原因。

标签: java jodatime


【解决方案1】:

1900-01-01 在 java 的 Date 和 joda 的 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);

【讨论】:

  • 日期为 java.sql.Date。如果是时区差异,为什么所有其他日期打印都是正确的?
  • @user1693380 你使用哪个时区?
  • jdk date 和 joda datetime 都使用 +8 时区。
  • comments.gmane.org/gmane.comp.java.joda-time.user/310 有人说有这个问题。但不在 datetimeformatter 中。
猜你喜欢
  • 1970-01-01
  • 2013-03-18
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 2014-12-12
  • 2021-08-17
相关资源
最近更新 更多