Отображение даты раньше 1970

Имеется дата, к примеру 31.12.1950. Как с помощью класса Date сделать корректный вывод? Sun Dec 31 00:00:00 SAMT 1950


Ответы (3 шт):

Автор решения: Fleckinger

Вы можете в конструкторе использовать отрицательные значения. В одних сутках 86 400 000 миллисекунд.

Date date = new Date(-864_000_000); 

Mon Dec 22 03:00:00 MSK 1969

Но лучше вообще не использовать класс Date, а пользоваться классами пакета java.time

→ Ссылка
Автор решения: Alex Rudenko

Сделать это с помощью только класса Date вряд ли получится, понадобится как минимум SimpleDateFormatter, для которого надо будет установить часовой пояс Europe/Samara.

Смещение во времени можно подобрать вручную - грубо говоря, между 31 декабря 1950 и 1 января 1970 (началом эпохи) прошло 19 лет (из которых 5 были високосные: 1952, 1956, 1960, 1964, 1968) и 1 день, c учётом 4-часового смещения.

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("Europe/Samara"));

Date old = new Date(- 3600_000L * 24 * (14 * 365 + 5 * 366) - 28 * 3600_000L);
System.out.println(sdf.format(old));

Вывод:

Sun Dec 31 00:00:00 SAMT 1950

При помощи Java Date/Time API (JSR 310) также потребуется использовать DateTimeFormatter, но установить дату в экземпляре ZonedDateTime будет гораздо проще:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz uuuu");
ZonedDateTime zonedDateTimeOf = ZonedDateTime.of(
    1950, 12, 31,               // дата
    0, 0, 0, 0,                 // время, включая наносекунды
    ZoneId.of("Europe/Samara")  // часовой пояс
);
System.out.println(formatter.format(zonedDateTimeOf));
// -> Sun Dec 31 00:00:00 SAMT 1950
→ Ссылка
Автор решения: anton_63

Проблема решена! С помощью класса Calendar можно получить нормальное отображение даты. Просто создаем объект

Calendar calendar = new GregorianCalendar(year, month - 1, day);

И потом через getTime() получаем Date.

Date date = calendar.getTime();
→ Ссылка