繁体   English   中英

JodaTime从Java.util.Date转换为DateTime(或LocalDate)

[英]JodaTime convert from Java.util.Date to DateTime (or LocalDate)

构造DateTime(或LocalDate)时遇到问题。 我正在将旧代码转换为内部使用joda,以使事情更加理智。 但是我遇到了+1900问题...

通过:

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?

从javadoc中获取java.util.Date(int year, int month, int date)

不推荐使用。 从JDK 1.1版开始,由Calendar.set(year + 1900,month,date)或GregorianCalendar(year + 1900,month,date)取代。

分配一个Date对象并对其进行初始化,以便它表示由年,月和日期参数指定的一天的开始午夜,当地时间。

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

除了它声明Years参数与1900年的偏移量这一事实外,您不应该使用此构造函数,因为它已过时。 而是使用java.util.Calendar

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

您的代码很好。

结果令人困惑,因为Date构造函数及其getYear()方法可用于基于1900年的年份,因此不建议使用它们。

另请注意,从DateLocalDate Date / LocalDateTime Date转换需要一个时区,并且如果未明确指定则使用默认时区。

一些想法:

    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是一个不可变的datetime类,表示没有时区的日期。 (比较API, http://joda-time.sourceforge.net/apidocs/org/joda/time/LocalDate.html )LocalDate的计算是使用年表进行的。 对于所有计算,此年表将在内部设置为UTC时区。 如果您查看DateTime对象,除了事实,它基本上是相同的,它相对于时区计算其字段。 使用与现代格里高利历兼容的默认年代学(ISOChronology)进行计算。

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

-马库斯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM