изменение часового пояса grails / mysql - PullRequest
2 голосов
/ 02 августа 2010

Каков наилучший способ изменения часового пояса приложения?На мой взгляд, должно произойти следующее:

  1. Сервер TZ изменен sys admin
  2. mysql должен быть перезапущен.
  3. каждый раз на основе столбца в базе данныхдолжны быть обновлены все значения, используя convert_tz или эквивалентный.Поэтому необходимо написать либо сценарий mysql, либо сценарий grails, который загружает каждую строку для каждого класса, обновляя все временные поля.

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

Есть ли лучший / более простой способ сделать это?

Ответы [ 3 ]

3 голосов
/ 02 августа 2010

Java не использует часовые пояса при использовании дат; он хранит все как UTC и использует только часовые пояса при отображении дат. см. следующую ссылку для обсуждения даты / времени Java. http://www.odi.ch/prog/design/datetime.php

2 голосов
/ 12 февраля 2016

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

Во-первых, я использую Grails 2.5.1 и PostgreSQL 9.4 в качестве бэкэнда.

Во-вторых, поля даты в Groovy / Grails хранятся как timestamp without time zone в PostgreSQL. Поэтому мне кажется, что первый ответ выше не совсем корректен - дата не сохраняется в UTC. Это наблюдение заставило меня задуматься ... в духе "хорошо, если база данных не знает, что такое часовой пояс, кто знает"? И первым ответом, который пришёл на ум, было «возможно, это весна».

В-третьих, специфика моей проблемы в том, что у меня много дат, которые я загружал в базу данных с помощью BootStrap.groovy и new ThisClass().save(). И поскольку это были даты, а не даты + время, все они выглядят как 2005-11-03 00:00:00 как метки времени PostgreSQL (без часовых поясов).

В-четвертых, то, что действительно понизило пенни, было, когда я отредактировал один из моих GSP, чтобы включить часовой пояс в строку формата даты, которая отображалась как PST (где находится мой сервер); и когда я включил timeZone="Asia/Kolkata" в g:formatDate соответствующего поля, время увеличилось на 12:30. Совершенно очевидно, что мой сервер работал в PST8PDT, и, поскольку это был не PostgreSQL, я вернулся в Spring как потенциальное место для перемен.

В-пятых, после прочтения нескольких комментариев об установке языкового стандарта в grails-app/conf/spring/resources.groovy Я решил попробовать установить там языковой стандарт и часовой пояс, согласно:

// Place your Spring DSL code here
beans = {
    // from http://stackoverflow.com/questions/1569446/grails-how-to-change-the-current-locale
    localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) {
        defaultLocale = new Locale("en","IN")
        java.util.Locale.setDefault(defaultLocale)
        println "configure spring/resources.groovy defaultLocale $defaultLocale"
        defaultTimeZone = TimeZone.getTimeZone("Asia/Kolkata")
        java.util.TimeZone.setDefault(defaultTimeZone)
        println "configure spring/resources.groovy defaultTimeZone $defaultTimeZone"
    }
}

Я также использовал g:format timezone="Asia/Kolkata" format="dd MMM, yyyy a z" для всех своих полей даты. И это, по-видимому, интерпретирует все данные в полях PostgreSQL timestamp в правильном часовом поясе и в ожидаемый час (т. Е. В час, который был введен), даже если даты были впервые введены «в неправильном часовом поясе».

Шестое, g:datePicker - Я прочитал несколько постов о том, как сделать этот «чувствительный часовой пояс», но я обнаружил, что его даты интерпретируются как часовой пояс, используемый Spring, и поэтому в моем случае это именно то, что я необходимость. И наоборот, если кто-то хочет ввести даты в своей локали и сделать так, чтобы Spring конвертировал их на лету в часовой пояс сервера, я думаю, это потребует дополнительных усилий.

Лично я думаю, что было бы здорово, если бы g:datePicker принял timeZone в качестве параметра и использовал его так же, как g:formatDate.

1 голос
/ 11 сентября 2012

У нас были проблемы с разницей во времени между использованием GORM и использованием groovy.sql.Sql (для более быстрого импорта данных).

В GORM использовался часовой пояс конфигурации grails (UTC), который мы установили в Bootstrap, ноgroovy sql использовал системный часовой пояс по умолчанию (GMT).

Проблема была решена путем установки часового пояса в $ JAVA_OPTS, хотя можно было добавить переключатель для опций grails или команды run-app.

grails -Duser.timezone=UTC run-app

...