2016-10-17 9 views
0

"yyyyMMdd"という文字列の日付 "20160104"があり、GMT-12タイムゾーンです。DateFormatを解析して、指定したタイムゾーンに文字列の日付を設定する方法

JavaのDateオブジェクトと同じものを解析しようとしています。期待される結果はFastTime = 1451908800000. 2016年1月4日(月曜日)12時00分00秒PM GMT

この

DateFormat gmtMinus12 = new SimpleDateFormat("yyyyMMdd"); 
gmtMinus12.setTimeZone(TimeZone.getTimeZone("Etc/GMT-12")); 
// gmtMinus12.getCalendar().setTimeZone(TimeZone.getTimeZone("Etc/GMT-12")); 
gmtMinus12 
    .setCalendar(Calendar.getInstance(TimeZone.getTimeZone("Etc/GMT-12"))); 

try { 
    Date date = gmtMinus12.parse("20160104"); 

} catch (ParseException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

のようなものを試してみましたが、解析された出力が

ある

です

FastTime = 1451822400000です。 2016年1月3日日曜日GMT

どのようにして、DateFormatに割り当てられているタイムゾーンと同じ時間帯になるようにしますか?

ご協力いただきまして誠にありがとうございます。

ありがとうございます。

+0

入力文字列に明示的にタイムゾーンを追加します(および解析パターン) –

+3

異なるタイムゾーンで日付を指定すると、結果がUTCの午前0時になるのはなぜですか?基本的に、Etc/GMT-12の2016年1月4日月曜日は、既に取得している値から始まります。 –

+0

申し訳ありませんが、私は期待した結果を編集しました。 GMT-12の 20160104 00:00 (ハワイを仮定すると)20160104 12:00 PMのロンドンになる可能性があるので、結果は2016年1月4日月曜日になると予想しています12:00:00 PM GMT – wamsea

答えて

0

あなたの本当の問題は、古くて厄介なAPIを使用するだけでなく、を間違ったオフセットを使用することです。 Etc/GMT-12(= UTC + 12:00)の代わりに

Etc/GMT+12(= UTC-12:00)を使用してください。

古くなったEtc /標準のタイムゾーンオフセットとは逆の符号を使用するため、非常に混乱します。translation table in TZ-databaseも参照してください。

+0

あなたはそんなに。これは実際に私の問題を解決しました。 – wamsea

+0

「Etc/GMT + 12」と書くのではなく、「GMT-12」と書くこともできます(読みやすくするため)。 –

1

java.time

あなたは今java.timeクラスに取って代わら面倒古い日時のクラスを使用しています。

LocalDateクラスは、時間帯のないタイムゾーンのない日付のみの値を表します。

DateTimeFormatter f = DateTimeFormatter.ofPattern ("uuuuMMdd"); 
LocalDate ld = LocalDate.parse ("20160104" , f); 

は今OffsetDateTimeオブジェクトを提供するために1日の時間とoffset-from-UTCを割り当てます。

ZoneOffset offset = ZoneOffset.ofHours (-12); 
LocalTime lt = LocalTime.MIN; // 00:00 
OffsetTime ot = OffsetTime.of (lt , offset); 
OffsetDateTime odt = ot.atDate (ld); 

odt.toString():2016-01-04T00:00-12:00

Instantを抽出し、UTCで同じ瞬間を参照します。

Instant instant = odt.toInstant(); 

instant.toString():2016-01-04T12:00:あなたが予想したよう00Z

は、時刻はUTCで4日正午です。

タイムゾーン

あなたはGMT-12タイムゾーンではないことを知っている必要があります。それはoffset-from-UTCです。

time zoneは、夏時間(DST)などの異常を処理するための規則のセットであるオフセットです。

目的のタイムゾーンがわかっている場合は、単なるオフセットではなく、それを適用する必要があります。 continent/regionの形式でproper time zone nameを指定します。ESTまたはISTのような3〜4文字の略語は、標準化されておらず、ユニークではない(!)ため、絶対にタイムゾーンではないので使用しないでください。

ZoneId z = ZoneId.of("Asia/Kamchatka"); 
ZonedDateTime zdt = odt.atZoneSameInstant(z); 

zdt.toString():2016-01-05T00:00 + 12:00 [アジア/カムチャッカ]

java.timeについて

java.timeフレームワークが構築されていますJava 8以降への移行これらのクラスは、java.util.Date,.Calendar,& java.text.SimpleDateFormatなどの面倒な古いlegacy日時クラスに取って代わります。

Joda-Timeプロジェクトは、今maintenance modeで、java.timeへの移行をアドバイスします。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
    • ThreeTenABPプロジェクトはThreeTen-バックポート具体的にAndroidのため(上記)を適応させます。
    • How to use…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題