あなた質問は既に答えられている。私はあなたのコードの現代版を提供したがっています。
java.time
あなたは長い時代遅れのクラスSimpleDateFormat
とDate
を使用しています。 java.time
は、JSR-310としても知られている近代的なJavaの日付と時刻のAPIは、一般的に非常に使い勝手が良いです。あなたの特定のケースでは、コードはかなり似ています
String date = "2017-11-17 10:49:39.772 ";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS ");
ZoneId zid = ZoneId.of("Europe/Amsterdam");
ZonedDateTime zdt = LocalDateTime.parse(date, dtf).atZone(zid);
System.out.println(zdt);
これは私が@DarrenWはすでに言ったことを繰り返す必要はありません
2017-11-17T10:49:39.772+01:00[Europe/Amsterdam]
出力します。あなたの入力文字列がスペースと時間がないオフセットに終了した場合、その後にZ
Z
はUTCからのオフセットと一致しているため、フォーマットパターン文字列もスペースで終わる必要があります(これはとにかく繰り返しました)。
Date
とは逆に、ZonedDateTime
にはタイムゾーンがあります(名前が示すように)、これはあなたの要件をよりよく満たすと考えていました。お電話date.getTime()
は、私00:00:00 GMTを使用すると、1970年1月1日からのミリ秒数後にしている印象を与えた(:それは憶測かもしれエポック
からのミリ秒を取得
"エポック")。その場合は、操作を行います。
は long millisSinceEpoch = zdt.toInstant().toEpochMilli();
結果は文字列にタイムゾーンoffestで
もっと憶測を解析
1510912179772
、私は考えて助けることができなかったが何であるかをがちょうどかもしれませんが発生しました。フォーマットパターンの文字列と一致する日付時刻文字列を受け取ったが、タイムゾーンのオフセットが間違っていたあなたのストリングの終わりに。これがそうであった場合は、近代的なAPIはちょうど解析中にオフセット間違っを無視することによって、より簡単かつエレガントな状況に対処することができます
String date = "2017-11-17 10:49:39.772 +0000";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS Z");
ZoneId zid = ZoneId.of("Europe/Amsterdam");
ZonedDateTime zdt = LocalDateTime.parse(date, dtf).atZone(zid);
は結果が、再び上記の最初のスニペットからと全く同じ2017-11-17T10:49:39.772+01:00[Europe/Amsterdam]
です。 LocalDateTime
は、タイムゾーンやオフセット情報のない日時であるため、文字列からのオフセットが不正確になることはありません。とにかくatZone()
は、正しいタイムゾーンを設定しています。
これを取得するもう1つの方法は、ZonedDateDate
に解析し、そのwithZoneSameLocal()
を呼び出して不要なオフセットを取り除くことです。
日付文字列の最後にスペースがありますか?ただ疑問に思う。もちろん、それはまだ解析することができます。 –
あなたのコードはコンパイルされますか? 'date'は' String'と宣言され、 'String'は' getTime'メソッドを持たないが、最後のコード行はそれを呼び出そうとします。 –
'SimpleDateFormat'をまだ使用している理由は何ですか?私はそれが古くから考えており、Stack Overflowに関する質問の数から判断すると、多くの人にトラブルを引き起こしています。 'java.time'は、JSR-310とも呼ばれる近代的なJavaの日時APIです。 –