Неправильная дата из Java GET - PullRequest
0 голосов
/ 12 декабря 2018

Я создаю систему управления заказчиками, используя Angular для моего внешнего интерфейса и Java EE в качестве моего бэкэнда.Проблема в публикации и получении правильной даты рождения.Пост, кажется, работает нормально.

countryCode	US
dateOfBirth	1998-08-05
firstName	Eva
gender	F
lastName	Egger

и в моей базе данных дата добавляется просто так, но по какой-то причине я, когда я ПОЛУЧАЮ данные, дата представляет собой совершенно другой формат.

gender	F
dateOfBirth	902268000000
firstName	Eva
lastName	Egger
countryCode	US

Может ли быть на стороне java необходимость конвертировать java.sql.Date в java.util.Date?но это тоже не имеет смысла, потому что мне не нужно было делать какие-либо преобразования, когда я делал POST.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Избегайте устаревших классов даты и времени

java.sql. Дата до java.util.Date

Эти ужасные классы были вытеснены много лет назад, но java.time классы.

java.time

Для значения только для даты, без времени суток и без часового пояса используйте класс LocalDate в Java.В вашей базе данных используйте тип данных в вашем столбце, аналогичный стандарту SQL DATE.

Вы, очевидно, использовали в своей базе данных неправильный тип , который сочетает дату с временем суток и, возможно, с часовым поясом.

Вы не показали нам достаточно деталей для правильного решения.Но, скорее всего, вы смешиваетесь в часовом поясе , возможно, неявно, когда переводите свою дату только в дату-время.Кажется, что это часовой пояс, например America/Noronha, Atlantic/South_Georgia или America/Miquelon.

Обработка даты и времени с помощью JDBC и java.time описана много-много раз, поэтому ищите переполнение стека , чтобы узнать гораздо больше.

Отсчет от эпохи

Что касается вашего загадочного числа, то оно представляется числом миллисекунд с момента обращения эпохи первого момента 1970 UTC, 1970-01-01T00: 00: 00Z.

long input = 902_268_000_000L ;
Instant instant = Instant.ofEpochMilli( input ) ;

Вы можете запустить этот код в прямом эфире на IdeOne.com .

instant.toString (): 1998-08-04T22: 00: 00Z

Смарт-объекты, а не немые строки

1998-08-05

Мне не нужно было выполнять какие-либо преобразования, когда я выполнял POST

Что YYYY-MM-DD является форматом по умолчанию, используемым в SQL (и в ISO 8601стандарт, кстати).Очевидно, вы отправляете простые строки в вашу базу данных.Научитесь использовать умные объекты, а не тупые строки при взаимодействии с вашей базой данных.

Начиная с JDBC 4.2 вы можете обмениваться типами java.time с базой данных с помощью методов getObject & setObject.

LocalDate ld = LocalDate.parse( "1998-08-05" ) ;  // For a column of type `DATE`. 
myPreparedStatement.setObject( … , ld ) ;

Извлечение.

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;  // For a column of type `DATE`. 

О java.time

Платформа java.time встроена в Java 8 и более поздние версии.Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздних версий - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

Проект ThreeTen-Extra расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 12 декабря 2018

Поскольку его преобразуют в объект даты Java, когда он исходит из базы данных, а затем он сериализуется в строковую метку времени.(возможно) Вставьте его сюда https://www.unixtimestamp.com/ - просто обрежьте 3 нуля, так как это миллисекунды, и вы увидите

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...