2016-08-23 1 views
1

Когда я запускаю код ниже локально, дата & Время вернется как UTC правильно (на стороне клиента). Когда я запускаю сервер GAE локально и записываю в базу данных mySQL, находящуюся в Облаке Google, он также сохраняет дату как UTC.TimeZones в Google Web Toolkit (GWT), GAE и Google Cloud SQL (mySQL)

Однако, когда я развертываю webapp в Google App Engine (GAE), время хранится как UTC + 4 часа. Тот же mySQL-сервер в Google Cloud установлен в часовой пояс Eastern/NY, что означает, что сервер mySQL компенсирует (что, по его мнению, UTC), добавив 4 часа для моего прохождения в UTC.

Другими словами, mySQL добавляет 4 часа, когда GAE отправляет это значение ... но не тогда, когда мой локальный сервер делает это. Поэтому я предполагаю, что вопрос в том, почему он правильно хранится, когда я убегаю от своего локального GAE, но добавляю 4 часа при запуске GAE?

Объект TimeZone из библиотеки com.google.gwt.i18n.client.TimeZone. Как я могу гарантировать время и время UTC независимо от того, где находится мой клиент или сервер? Мое приложение не может полагаться на какой-либо сервер на время, поскольку он будет работать в автономном режиме большую часть времени.

private static Date getNowDateTimeUTC() { 
    DateTimeFormat df = DateTimeFormat.getFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    String utcDateString = df.format(new Date(), TimeZone.createTimeZone(0)); 
    Date returnDate = DateTimeFormat.getFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(utcDateString); 
    returnDate.setTime((returnDate.getTime()/1000) * 1000); // rid the milliseconds 
    return returnDate; 
} 
+0

Избегайте использования класса Date, оно имеет недостатки. Java 8 имеет для этого Instant-класс. –

+0

GAE по-прежнему поддерживает только Java 7 :( –

+0

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

ответ

0

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

0
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); 

Может быть, вы можете установить часовой пояс, как это, которое вы хотите. Азия/Шанхай заменяет ваш часовой пояс!

0

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