Отображение даты раньше 1970
Имеется дата, к примеру 31.12.1950. Как с помощью класса Date сделать корректный вывод? Sun Dec 31 00:00:00 SAMT 1950
Ответы (3 шт):
Вы можете в конструкторе использовать отрицательные значения. В одних сутках 86 400 000 миллисекунд.
Date date = new Date(-864_000_000);
Mon Dec 22 03:00:00 MSK 1969
Но лучше вообще не использовать класс Date, а пользоваться классами пакета java.time
Сделать это с помощью только класса 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
Проблема решена! С помощью класса Calendar можно получить нормальное отображение даты. Просто создаем объект
Calendar calendar = new GregorianCalendar(year, month - 1, day);
И потом через getTime() получаем Date.
Date date = calendar.getTime();