Необходимо сохранить локальную дату из Json-ввода в Oracle-DB в приложении с весенней загрузкой - PullRequest
1 голос
/ 02 мая 2019

У меня есть локальная дата в формате json, введенная в формате String. dd-MM-yyyy HH:mm:ss формат [пусть это будет любой формат, без проблем], с отдельным полем для часового пояса в заголовке [например: CST, CDT и т. Д.]. В Java, когда я пытаюсь создать дату с этим значением и часовым поясом, он создается с моим системным [jvm running system] часовым поясом.

Мне нужно сохранить точную дату и время от ввода с часовым поясом ввода. Как мне это сделать ?

Я даже пытался поместить объект даты с @DateTimeFormat в dto вместо строки, но это не сработало.

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

public Date getLocalDate(String dateString, String localTimeZone) {

  SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss a");   
  formatter.setTimeZone(TimeZone.getTimeZone(localTimeZone));        
  return formatter.parse(dateString);
}

Ввод: dateString: "20-04-2019 20:15:00 AM" localTimeZone: "CDT".

Ожидаемый результат: объект Date со значением 20-04-2019 20:15:00 AM CDT.

Фактический результат: та же дата с разницей в часах IST-CDT с часовым поясом IST

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

java.time

Вы используете ужасные классы даты и времени, которые были вытеснены несколько лет назад классами java.time , определенными в JSR 310.

«CST» и такие псевдозоны из 2-4 символов не являются часовыми поясами. Они не стандартизированы и даже не уникальны! Пример: CST - центральное время в Северной Америке, а также стандартное время Китая.

Истинные часовые пояса в формате Continent/Region. Пример: Europe/Paris или Africa/Tunis. Смотрите список в Википедии.

Чтобы представить дату и время суток в контексте часового пояса, используйте ZonedDateTime class.

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

База данных

Ваши комментарии указывают на желание сохранить текущий момент в базе данных.

Захватить текущий момент в UTC.

Instant instant = Instant.now() ;

Для использования с JDBC 4.2, преобразовать в OffsetDateTime.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;

Перейдите к подготовленному заявлению.

myPreparedStatement.setObject( … , odt ) ;

Получить.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
0 голосов
/ 02 мая 2019

Существует неправильное понимание того, что на самом деле является Date объектом. Это просто количество миллисекунд с '01-01-1970 00:00:00 UTC'. Иными словами, это всегда дата / время в формате UTC, и оно неявно преобразуется в ваш местный часовой пояс средством форматирования по умолчанию при попытке его печати. ​​

Если вы хотите сохранить как instant (т.е. дату / время в формате UTC), так и часовой пояс, вам придется использовать объект Calendar. Но в любом случае, если вы хотите сохранить в Oracle как время, так и зону, вам следует непосредственно сохранить строку или дату и строку (для часового пояса), поскольку поля AFAIK, Oracle DATE не имеют понятия о часовом поясе.

...