2012-01-30 130 views
0

我在构建DateTime(或LocalDate)时遇到了问题。我将旧代码转换为内部使用joda以使事情更加理智。不过我跑入1900问题...JodaTime从Java.util.Date转换为DateTime(或LocalDate)

这传递:

assertEquals(2082, new Date(2082, 1, 1).getYear()); 

这些都失败:

assertEquals(2083, new LocalDate(new Date(2083, 1, 1)).getYear()); 
assertEquals(2084, new DateTime(new Date(2084, 1, 1)).toLocalDateTime().getYear()); 

这是怎么回事?如何从Date对象获取DateTime?

+0

你会得到什么结果? – Alexandre 2012-01-30 19:22:00

+0

我得到3983(这是2083 + 1900)和3984(这是2084 + 1900) – 2012-01-30 19:33:06

回答

5

从Javadoc文档java.util.Date(int year, int month, int date)

已过时。从JDK版本1.1开始,由Calendar.set(年份+ 1900,月份,日期)或GregorianCalendar(年份+ 1900,月份,日期)取代。

分配Date对象并进行初始化,使其在 年,月,日参数指定的日期开始时代表 午夜本地时间。

参数:年份减去1900.月份在0-11之间。 在1-31之间的月份日期。

除了说明年份参数是从1900年开始的偏移量之外,您不应该使用此构造函数,因为它已被弃用。相反,使用java.util.Calendar

Calendar cal = Calendar.getInstance(); 
cal.set(2083, 1, 1); 
assertEquals(2083, new LocalDate(cal).getYear()); 
3

你的代码没问题。

由于构造函数Date及其getYear()方法适用于1900年的年份,因此您会得到令人困惑的结果,这就是为什么它们已被弃用。

另请注意,从DateLocalDate/LocalDateTime的转换需要一个时区,如果没有明确给出,则使用默认的时区。

+0

不应该DateTime照顾这对我吗?或者我需要构建与-1900内置的日期对象? '新日期(2082-1​​900,1,1)' – 2012-01-30 19:59:27

+0

@DavidM.Coe:它怎么样在意? “Date”代表一个确切的实例,JodaTime不能改变它。是的,当你使用'Date'API时,你需要关心它的怪癖。 – axtavt 2012-01-30 20:06:15

+0

您可以想象DateTime(日期日期)的实现将创建DateTime对象从年减去-1900的情况。我会喜欢:( – 2012-01-30 21:23:39

1

一对夫妇的想法:

Date date= new Date(2083, 1, 1); 

    DateTime dt = new DateTime(2083, 1, 1, 0, 0, 0, 0); 

    assertEquals(2083, new LocalDate(dt).getYear()); 

    assertEquals(3983, new LocalDate(date).getYear()); 

确定。简短介绍:LocalDate是一个不可变的日期时间类,代表没有时区的日期。 (比较API,http://joda-time.sourceforge.net/apidocs/org/joda/time/LocalDate.html) LocalDate上的计算使用Chronology进行。这个年表将在内部设置为所有计算的UTC时区。 如果您查看DateTime对象(除了事实基本相同),它将根据时区计算其字段。计算使用与现代公历日历兼容的默认年表(ISOChronology)完成。

您的问题:java.util.Date构造函数使用年,月,日,年为整数y - 1900. 在您的示例中,2083代表年份3983(!)(http://docs.oracle.com/ JavaSE的/ 7 /文档/ API/JAVA/util的/ Date.html)。 就是这样......你错过了-1900 ..是的,java.util。日期有1900问题;)

-Markus