2016-08-23 10 views
1

ローカルで以下のコードを実行すると、日付&の時刻が正しく(クライアント側で)UTCとして返されます。ローカルでGAEサーバーを実行し、Google Cloudに存在するmySQLデータベースに書き込むと、日付も正しくUTCとして保存されます。Google Web Toolkit(GWT)、GAE、Google Cloud SQL(mySQL)のタイムゾーン

ただし、Google App Engine(GAE)にwebappをデプロイすると、その時間はUTC + 4時間として保存されます。 Google Cloudの同じmySQLサーバーがEastern/NYタイムゾーンに設定されています。これは、渡されたUTC時間に4時間を追加することで、mySQLサーバーがUTCに補うことを意味します。

言い換えれば、mySQLはGAEが値を送信するときに4時間を追加しますが、ローカルサーバーがそうしている場合は追加しません。だから私は疑問に思う、なぜ私は私のローカルGAEをオフに実行すると、正しく格納されますが、GAEで走ったときに4時間を追加?

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

日時をepoch秒で保存すると、同じストレージサイズ...とmySQLは日付のタイムゾーンを調整しようとしません。 –

答えて

0

私は、実際の日付の代わりにエポックから秒数を保存しました。この方法では、mySQLはタイムゾーンを修正しようとしません。

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

たぶん、あなたが欲しい、このようなタイムゾーンを設定することができます。アジア/上海があなたのタイムゾーンを置き換えます!

0

私の会社のプロジェクトでは、クライアント側でjsTimezoneDetect libraryを使用してJavaScriptでタイムゾーンを検出しています。ライブラリを使用するのは簡単です。

関連する問題