2016-09-11 2 views
1

У нас есть служба на основе ресурсов, которая берет дату и время в качестве параметров для извлечения данных из бэкэнд.Получите zoneID от запроса, чтобы преобразовать дату и время запроса в формат UTC в java 8

Данные хранятся в базе данных в формате UTC, а сервер также настроен по часовой пояс UTC.

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

Для выполнения преобразования у меня есть код ниже, который преобразуется из заданного zoneId в формат UTC.

public ZonedDateTime convertDateBetweenTimeZones(LocalDateTime sourceDateTime,String sourceZone,String targetZone){ 
    return sourceDateTime.atZone(ZoneId.of(sourceZone)).withZoneSameInstant(ZoneId.of(targetZone)); 
    } 

Я призываю выше метод, как показано ниже,

ZonedDateTime zonedDateTime=convertDateBetweenTimeZones(LocalDateTime.now(),"Asia/Calcutta","UTC"); 

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

Мой вопрос, в моем случае, я прошел «Азия/Калькутта» в качестве идентификатора зоны исходного часового пояса. Но исходным часовым поясом может быть что угодно, «Америка/Нью-Йорк» или даже «Азия/Сингапур».

Итак, в этом случае я не уверен, как я могу динамически получить zoneId из запроса, полученного от клиента, чтобы я мог его соответствующим образом преобразовать.

Может ли кто-нибудь помочь мне в том, как я могу получить zoneId или альтернативный способ обработки моего сценария.

Спасибо,

JavaUser

ответ

0

Одно из решений вы можете использовать карту псевдоним, чтобы сохранить нестандартные временные идентификаторы зоны и переходят в ZoneId.of(id, alias) метод. Пример:

HashMap<String, String> aliasMap = new HashMap<>(); 
aliasMap.put("FOO", "America/New_York"); 
ZoneId zoneId = ZoneId.of("FOO", aliasMap); 
1

Вы делаете все хорошо, но для трех вещей.

Игнорирование часового пояса Настройки сервера

настройка зоны время сервера должно быть никакого отношения к вашему кодирования. Настройка сервера может измениться в любое время, поэтому вы не можете положиться на это.

Всегда передавайте необязательный объект часового пояса всем соответствующим методам java.time, чтобы указать любой часовой пояс, который вы ожидаете/желаете.

Вы разумно используете proper IANA 'tz' time zone names в формате continent/region, таком как America/Montreal. Никогда не используйте аббревиатуры 3-4 букв, такие как EST или IST, поскольку они не являются настоящими часовыми поясами, а не стандартизированы и даже не уникальны (!).

Database

Для обмена базами данных, вы, вероятно, необходимо извлечь Instant из ZonedDateTime через toInstant метода. Большинство серьезных баз данных хранит дату в UTC. Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд.

Драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии, вероятно, могут использовать Instant непосредственно через ResultSet::getObject и PrepatedStatement::setObject. Если нет, вернитесь к короткому преобразованию в типы java.sql, такие как java.sql.Timestamp.

внимательно изучите поведение вашей базы данных с обработкой даты и времени; различные базы данных меняют широко на этом (!). Спецификация SQL мало говорит о теме обработки даты, прошедшей смутно игнорируя несколько типов дней. Некоторые из них, как Postgres, имеют отличную поддержку в режиме даты, в то время как другие имеют плохую поддержку, и все они отличаются поведением.

время Браузера зона

Что касается определения часового пояса с помощью веб-браузера, что не просто. Search Stack Overflow для получения дополнительной информации по многим вопросам и ответам, уже опубликованным.

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