JodaTime конвертировать из Java.util.Date в DateTime (или LocalDate) - PullRequest
0 голосов
/ 30 января 2012

Я сталкиваюсь с проблемой при создании 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());

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

Ответы [ 3 ]

5 голосов
/ 30 января 2012

Из Javadoc для java.util.Date(int year, int month, int date):

Устаревший.Начиная с версии 1.1 JDK, заменяется на Calendar.set (год + 1900, месяц, дата) или GregorianCalendar (год + 1900, месяц, дата).

Распределяет объект Date и инициализирует его так, чтобы он представлял полночьпо местному времени в начале дня, указанного аргументами год, месяц и дата.

Параметры: год год минус 1900. месяц месяц между 0-11.укажите дату месяца в диапазоне от 1 до 31.

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

Calendar cal = Calendar.getInstance();
cal.set(2083, 1, 1);
assertEquals(2083, new LocalDate(cal).getYear());
3 голосов
/ 30 января 2012

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

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

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

1 голос
/ 30 января 2012

пара идей:

    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/docs/api/java/util/Date.html). Вот и все ... вы пропустили -1900 .. и да, java.util.Date имеет проблему 1900;)

-Markus

...