2017-04-03 2 views
0

私たちのサーバーはオランダで稼働していますが、ユーザーは英国でアプリケーションを使用しています。オランダのようなCETで動作するサーバーでイギリスの日帰り時間に取り組む方法

英国では2017-03-26 02:30:00は有効ですが、オランダでは有効ではありません。

タイムゾーンを設定してコードを使用して時刻を変換しています。しかし、それは私に正しい出力を与えていない。

String toDate ="2017-03-26 02:30:00";//Valid Time in UK 
    Date date = new Date(); 
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

    // Use London's time zone to format the date in 
    df.setTimeZone(TimeZone.getTimeZone("London")); 

    System.out.println("Date and time in London: " + df.parse(toDate)); 

プログラムからの出力:ロンドンでの日付と時刻:日3月26日4時30分00秒CEST 2017

必要な出力:ロンドンでの日付と時刻:日3月26日2時30分00秒CEST 2017

使用Javaバージョン:1.7。依存関係のためにjoda時間を使用することはできません。

+2

タイムゾーン「ロンドン」は正しいですか? –

+0

最初に 'TimeZone.setDefault(TimeZone.getTimeZone(" Europe/London "))'を実行しようとしましたが、出力がほぼ正しいです: 'Sun Mar 26 02:30: 00 BST 2017'(** CEST **の代わりに** BST **) –

+1

ありがとうHugo。それは私のために働いた..私は私が望むものを得た。 – atanu2destiny

答えて

1

最初に細部、TimeZone.getTimeZone()は危険です、それはID文字列を認識しない場合、暗黙のうちにあなたにGMTを与えるでしょう。まさにロンドンでこれはあなたがしばらく騙されている正しいものにとても近いです。 TimeZone.getTimeZone("London")はあなたにUTC(またはGMT)を与えます。 Stefan Freitagが指摘したように、英国の正しいタイムゾーンはTimeZone.getTimeZone("Europe/London")でなければなりません。

次の非常に一般的な誤解:Dateオブジェクトにタイムゾーンがありません。それは時間のポイントです。では、どうしてSun Mar 26 04:30:00 CEST 2017と表示されますか?CESTは明らかにタイムゾーン(オランダで使用される中央ヨーロッパ夏時間)を参照していますか?日付を印刷するとき、暗黙のうちにDate.toString()が呼び出されます。このメソッドは、JVMのデフォルトのタイムゾーンに従って時刻を無条件に出力します。したがって、解析に使用したDateFormatのタイムゾーンを設定しても効果はありません。したがって、Hugoがコメントで行ったように、JVMのタイムゾーン設定を変更すると動作します。英国のユーザーに正しい出力を得るもう1つの方法は、英国の時間帯を持つDateFormatを使用して、日付を文字列に戻すことです。

DateFormatを作成する前に、最初にHugoのトリックを使用する場合は、英国のタイムゾーンがあり、df.setTimeZone()に電話する必要はありません(ただし、コードを明確にすると思われるかもしれません)。

Java 8以降を使用してください。 java.timeの新しい日付と時間のクラスは、古いもので経験した驚きを一般的に持っていません。

+1

そして記録のために... [java.time](http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)機能の多くはJavaにバックポーティングされています[ThreeTen-Backport](http://www.threeten.org/threetenbp/)の6&7、さらに[ThreeTenABP](https://github.com/JakeWharton/ThreeTenABP)のAndroidにも対応しました。 –

+0

@BasilBourque元のポスターが「依存関係のためにjoda時間を使うことができない」と言わなかったなら、私はこの点をさらに強調していただろう。私はThreeTen Backportもこの場合nogoであると仮定した。私は間違っていると思う。 :-) –

+1

私はそれがコメントとして投稿された理由を理解しています。私は後世に向かって話します。 ;-) –

関連する問題