Joda DateTime неправильно устанавливает дату в миллисекундах

Я предоставляю миллисекундные данные 1473080981L, которые должны датироваться: September 5, 2016 9:50 PM. Я выполняю модульное тестирование, и это был мой первый опыт работы с JUnit. Что я заметил до сих пор, так это то, что каждый раз, когда я звоню:

DateTime dateTime = new DateTime();
dateTime.withMillis(1473080981L)

Он по-прежнему возвращает правильную дату, но в настоящее время, на момент написания этой статьи, сейчас 22:00 вечера, вызов этого метода выдает September 5, 2016 10:00 PM. DateTime не учитывал время, которое я установил.

Это правильное поведение? Есть ли способ создать экземпляр DateTime, установив свое собственное предопределенное выбранное время даты?

Вот мой модульный тест (пожалуйста, смиритесь с тем, что это бессмысленно, я изучаю модульное тестирование):

String testDate = "September 5, 2016 9:50 PM"; // MMMM dd, yyyy K:mm a
String testDateResult1 = DateTimeFormatter.format(dateTime, DateTimeFormatter.FORMAT_DEFAULT_DATE_TIME_12);
String testDateResult2 = DateTimeFormatter.format(thisDay   , DateTimeFormatter.FORMAT_DEFAULT_DATE_TIME_12);

assertTrue(testDate.compareTo(testDateResult1) == 0);
assertTrue(testDate.compareTo(testDateResult2) == 0);

Мой DateTimeFormatter выглядит так:

public static String format(@NonNull DateTime dateTime, String validFormat) {
  org.joda.time.format.DateTimeFormatter dateTimeFormat = DateTimeFormat.forPattern(validFormat);
  return dateTimeFormat.print(dateTime);
}

public static String format(long dateToMillis, String validFormat) {
  org.joda.time.format.DateTimeFormatter dateTimeFormat = DateTimeFormat.forPattern(validFormat);

  DateTime dateTime = new DateTime();
  dateTime.withMillis(dateToMillis);

  return dateTimeFormat.print(dateTime);
}

Спасибо!


person Neon Warge    schedule 05.09.2016    source источник


Ответы (1)


Во-первых, обратите внимание, что 1473080981L равно Sun Jan 18 1970 01:11:20 по времени UTC. Вы можете проверить это на https://currentmillis.com/

Метод withMillis может возвращать новый экземпляр. Изменять:

dateTime.withMillis(dateToMillis);

to:

dateTime = dateTime.withMillis(dateToMillis);

или просто сделать:

dateTime = new DateTime(dateToMillis);

публичная дата и время сMillis(long newMillis)
Возвращает копию этой даты и времени с другими миллисекундами. Возвращаемый объект будет либо новым экземпляром, либо этим. Меняются только миллисекунды, хронология и часовой пояс сохраняются.

Параметры: newMillis — новые милли, от 1970-01-01T00:00:00Z
Возвраты: копия этой даты и времени с другими милли.

Демо:

import org.joda.time.DateTime;

public class JodaTest {

  public static void main(String[] args) {
    DateTime dateTime = new DateTime();
    dateTime = dateTime.withMillis(1473069000000L);

    System.out.println(dateTime);
    System.out.println(new DateTime(1473069000000L));
  }
}

Выход:

2016-09-05T11:50:00.000+02:00
2016-09-05T11:50:00.000+02:00
person Tobías    schedule 05.09.2016