2012-01-30 2 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()); 

Что здесь происходит? Как получить DateTime из объекта Date?

+0

Каковы результаты, которые вы получаете? – Alexandre

+0

Я получаю 3983 (это 2083 + 1900) и 3984 (это 2084 + 1900) –

ответ

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.

Помимо того факта, что аргумент years является смещением от 1900 года, вы не должны использовать этот конструктор, поскольку он устарел. Вместо этого используйте java.util.Calendar:

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

Ваш код в порядке.

Вы получаете путаные результаты, потому что конструктор Date и его метод getYear() работают с годами 1900 года, поэтому они устарели.

Также обратите внимание, что преобразование с Date в LocalDate/LocalDateTime требует часовой пояс и использует значение по умолчанию, если оно не указано явно.

+0

Не должно ли DateTime позаботиться об этом для меня? Или мне нужно построить объект даты с встроенным -1900? 'new Date (2082-1900, 1, 1)' –

+0

@ DavidM.Coe: Как он может заботиться? 'Date' представляет собой точный экземпляр во времени, и JodaTime не может его изменить. И да, когда вы работаете с API 'Date', вам нужно заботиться о своих причудах. – axtavt

+0

вы можете представить себе случай, когда реализация DateTime (Дата даты) создала объект DateTime, вычитая -1900 с года. Мне бы понравилось :( –

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()); 

Ok. Краткое введение: 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/документы/API/Java/Util/Date.html). Вот и все ... вам не хватало -1900 .. и да, java.util.Дата имеет проблему 1900;)

-Markus

 Смежные вопросы

  • Нет связанных вопросов^_^