2016-01-05 7 views
16

"2015-01-05 17:00"ZoneId"Australia/Sydney"のような文字列型の時間があります。Java 8与えられた時間と時間帯をUTC時刻に変換する

Java 8 datetime APIを使用して、この時刻情報を対応するUTC時刻に変換するにはどうすればよいですか?

また、DSTを検討する必要があります。

+1

「UTCタイム」とはどういう意味ですか?あなたはインスタントをしたいですか?またはjava.sql.Date?あるいは、時代以来の数ミリ秒? – assylias

答えて

32

あなたはJava8でZonedDateTimeクラスを探しています - タイムゾーンを持つ完全な日付時刻とUTC /グリニッジからのオフセットを解決しました。デザイン面では、このクラスは主にLocalDateTimeZoneIdの組み合わせとして表示する必要があります。 ZoneOffsetは、クラスが夏時間のオーバーラップ中に瞬間を表すことを保証するために使用される重要な、しかし二次的な情報です。例えば

ZoneId australia = ZoneId.of("Australia/Sydney"); 
String str = "2015-01-05 17:00"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 
LocalDateTime localtDateAndTime = LocalDateTime.parse(str, formatter); 
ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localtDateAndTime, australia); 

System.out.println("Current date and time in a particular timezone : " + dateAndTimeInSydney); 

ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(ZoneOffset.UTC); 

System.out.println("Current date and time in UTC : " + utcDate); 
+1

この結果は私が望むものではないようです。私はUTCの時刻に変換し、私のデータベースにUTCの時刻を保存したいと思います。 ZonedDateTimeは私が望むものではなく、DBの列型にマップできません。 – ttt

+2

申し訳ありませんが、例ではUTCへの変換を追加しました。 –

+2

Cool、LocalDateTimeをZonedDateTimeに変換してから、別のタイムゾーンに変換する必要があるようです。ありがとう。 – ttt

15

既存の答えの代わりにセットアップするために適切なタイムゾーンとフォーマッタです:

String input = "2015-01-05 17:00"; 
ZoneId zone = ZoneId.of("Australia/Sydney"); 

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(zone); 
ZonedDateTime utc = ZonedDateTime.parse(input, fmt).withZoneSameInstant(UTC); 

データベースと対話したいので、あなたが必要があるかもしれませんa java.sql.Timestampです。この場合、明示的にUTC時刻に変換する必要はありませんが、代わりにインスタントを使用できます。

ZonedDateTime zdt = ZonedDateTime.parse(input, fmt); 
Timestamp sqlTs = Timestamp.from(zdt.toInstant()); 
+0

このコンテキストでUTC変数とは何ですか? – BOWS

+1

これは、シドニーの「入力」と同じ瞬間に対応するUTCタイムゾーンの日付/時刻です。したがって、この場合、同じ日付になりますが、午前6時になります。 – assylias

0
**// Refactored Logic**  

     ZoneId australia = ZoneId.of("Australia/Sydney"); 
     ZoneId utcZoneID= ZoneId.of("Etc/UTC"); 
     String ausTime = "2015-01-05 17:00"; 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 

     //converting in datetime of java8 
     LocalDateTime ausDateAndTime = LocalDateTime.parse(ausTime, formatter); 

     // DateTime With Zone 
     ZonedDateTime utcDateAndTime = ausDateAndTime.atZone(utcZoneID); 
     // output - 2015-01-05T17:00Z[Etc/UTC] 

     // With Formating DateTime 
     String utcDateTime = utcDateAndTime.format(formatter); 
     // output - 2015-01-05 17:00 
関連する問題