2013-08-13 2 views
0

Я пытаюсь преобразовать значение даты строки в java на дату и попытаться сохранить его в таблице mysql.Проблема с часовым поясом Java & MySQL

Ниже фрагмент кода:

DateFormat dfm = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
String string = "07/24/2013 17:57:52 UTC"; 
Date a = dfm.parse(string); 
System.out.println(a); 

Моя проблема заключается в том, что приведенный выше код всегда возвращает следующий вывод на консоль: ср 24 июл 17:57:52 PDT 2013

Я не» я знаю, почему часовой пояс меняется, более того, когда я пытаюсь поместить это в базу данных, тогда он хранит его в формате «2013-07-24 17:57:52». Я не уверен, почему приведенный выше код возвращает мне часовой пояс в PDT?

Можете ли вы, ребята, объяснить мне это? Мое намерение заключается в сохранении даты UTC, которая появится как вход и сохранит ее в поле timestamp MySQL.

Спасибо заранее.

+0

Пожалуйста, покажите нам, как вы храните это в базе данных. Кроме того, у вашего ввода * есть *, чтобы иметь «UTC» в конце, или его можно было отбросить? (Мы не знаем, откуда поступает ваш вход.) Большинство остальных легко исправить ... –

+0

Что такое настройка часового пояса mysql? Используйте это, чтобы проверить: http://stackoverflow.com/a/930914/791406 – raffian

+0

@JonSkeet Спасибо, что ответили. Я могу программно удалить UTC. Но как это поможет. Удаление UTC из переменной String по-прежнему отображается так же, как указано выше. Также я использую JPA для сохранения данных. "Testdate testobj = новый testdate(); \t \t testobj.setAddDate (новый Отметка (a.getTime())); \t \t em.persist (testobj);" –

ответ

1

Правильно, если вы можете исправить строку, чтобы не включать часовой пояс, это проще. Во-первых, вам нужно понять, что объект Date не содержит часового пояса вообще - это только момент времени.

Далее, как мы пытаемся разобрать дату/время, указанное в UTC, вы должны установить, что в SimpleDateFormat:

DateFormat dfm = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
dfm.setTimeZone(TimeZone.getTimeZone("UTC")); 

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

Тем не менее, эта часть MySQL documentation заставляет меня нервничать:

MySQL преобразует значения TIMESTAMP из текущего часового пояса UTC для хранения, и обратно от UTC к текущему времени для поиска зоны. (Это не происходит для других типов, таких как DATETIME.)

Это звучит, как вы можете использовать DATETIME поле вместо того, чтобы остановить это время преобразования зоны. Установка часового пояса соединения с UTC поможет, если хранит, но вам все равно нужно беспокоиться о том, что произойдет при извлечении. (Базы данных довольно перепутаны, когда речь заходит о типах даты и времени, IMO. Это просто еще один пример этого ...) С другой стороны, если вы извлекаете данные обратно с Java, я бы надежда, что это будет просто работать прозрачно. Вероятно, стоит хотя бы попробовать ...

0

Вам не хватает части часового пояса в строке формата. Поэтому «UTC» игнорируется. Попробуйте это:

DateFormat dfm = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z"); // added "z" 
// then the rest of your code as-is 
String string = "07/24/2013 17:57:52 UTC"; 
Date a = dfm.parse(string); 
System.out.println(a); // prints "Wed Jul 24 19:57:52 CEST 2013" for me 

В дополнение к слову @JonSkeet «s предупреждения, MySQL„текущий часовой пояс“можно проверить или изменить с помощью переменной time_zone сеанса.

Либо убедитесь, что ваш сеанс настроен на UTC (SET time_zone = '+0:00'), либо вместо этого используйте тип DATETIME.

+0

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

+0

@SomnathGuha Если вы хотите иметь дело с часовыми поясами на уровне приложения (только), тогда do * not * используйте тип 'TIMESTAMP', но вместо этого тип' DATETIME'. – RandomSeed

Смежные вопросы