Кажется, в твоих годах была ошибка.Вы сами дали ответ в комментарии:
Я импортировал из CSV через Excel, и он автоматически отформатировал дату, чтобы удалить '19'
преобразование, которое вы хорошо выполнили для даты 1994 года:
System.out.println("Before: " + memberBirthdayDate);
LocalDate memberBirthday = memberBirthdayDate.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
System.out.println("After: " + memberBirthday);
Вывод:
Before: Sat May 21 00:00:00 IST 1994
After: 1994-05-21
Я использовал время в Европе / Дублине, чтобы воспроизвести ваш точный результат, поэтому IST для Irish Summer Time,Кажется, ваш Date
обозначает начало дня с некоторым смещением по Гринвичу, поэтому вам нужно использовать часовой пояс, который согласуется с этим смещением.Я ожидаю, что преобразование будет работать, как и ожидалось, по крайней мере для всех дат после 1900 года, а также, вероятно, и раньше.
Однако, когда год урезается с 1994 по 94, начинают происходить забавные вещи.Даты, которые далеко назад, не так хорошо определены.LocalDate
использует пролептический григорианский календарь, который практичен и четко определен, но не согласуется с датами, использовавшимися в реальной жизни до введения григорианского календаря с 1582 года и далее.Я не уверен, что Date
использует.Что касается дат, датируемых 94 годом нашей эры, мы не должны удивляться, что 21 мая наступит как 18 мая.
Before: Wed May 21 00:00:00 GMT 94
After: 0094-05-18
Ссылка: Статья в Википедии Григорианский календарь