Java.util.Date неправильно конвертируется в Java.time.LocalDate - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь преобразовать java Date в java LocalTime, и мой код выглядит следующим образом

Date memberBirthdayDate = club.getMembers().get(i).getDob();
        System.out.println(memberBirthdayDate);
        LocalDate memberBirthday = memberBirthdayDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

Когда я распечатываю дату до и после разговора, она выглядит так:

Before: Wed May 21 00:00:00 GMT 94
After: 0094-05-18

Похоже, что он конвертируется в обратном направлении, но я не могу понять, как это сделать!

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Кажется, в твоих годах была ошибка.Вы сами дали ответ в комментарии:

Я импортировал из 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

Ссылка: Статья в Википедии Григорианский календарь

0 голосов
/ 21 мая 2018

вы можете сделать это

 LocalDateTime memberBirthday = LocalDateTime.ofInstant(memberBirthdayDate.toInstant(), 
ZoneId.systemDefault());
Date out = Date.from(memberBirthday.atZone(ZoneId.systemDefault()).toInstant()); System.out.println(out);
...