2017-12-09 15 views
0

次のコードがあります。 Javaの日付時刻の文字列形式はgmt + 0です。したがって、後で別のローカルタイムゾーンに従って変換する必要がありますが、デフォルトのタイムゾーンを設定しようとすると、マシンがgmt + 8上にあるため、別の8時間前に戻ってきます。出力は私に2017-12-09 09:00 :00ですが、これはgmt + 0なので2017-12-09 17:00:00のままにします。Java設定のタイムゾーンがgmt + 0にデフォルト設定されていません

String existingTime = "2017-12-09 17:00:00"; 
    String newTime = "2017-12-09 14:00:00"; 

    Date existingDateTime = null; 
    Date newDateTime = null; 
    Date localexistingDateTime = null; 
    Date localnewDateTime = null; 
    DateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    TimeZone tz = TimeZone.getDefault(); 
    sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 
    // sdf.setTimeZone(TimeZone.getTimeZone("GMT+8:30")); 

    try { 
     existingDateTime = dateTimeFormat.parse(existingTime); 
     newDateTime = dateTimeFormat.parse(newTime); 

     System.out.println("GMT existingDateTime" + sdf.format(existingDateTime)); 
     System.out.println("GMT newDateTime" + sdf.format(newDateTime)); 
    } catch (ParseException ex) { 
     System.out.println("MyError:Parse Error has been caught for date parse close"); 
     ex.printStackTrace(System.out); 
    } 
+2

従来の 'java.util.Date'の使用を強く勧めることはできません。これが理由の1つです。代わりに、あなたのユースケースにふさわしい 'java.time'パッケージ内の適切なクラスを探すべきです。 –

+0

@ JoeCだから、これを克服するためのあなたの提案は、これを示しているGoogleのソリューションのほとんどを引き起こします。 – user8012596

+2

私の提案は、 'java.util.Date'の使用をやめ、代わりに' java.time'パッケージのクラスを使用することです。 –

答えて

2

このスニペットでは、最新のJavaの日付と時刻のAPIであるjava.timeを使用することができます。 Java Specification Requestの後にJSR-310としても知られています。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"); 
    String existingTime = "2017-12-09 17:00:00"; 
    OffsetDateTime existingDateTime = LocalDateTime.parse(existingTime, formatter) 
      .atOffset(ZoneOffset.UTC); 
    System.out.println("UTC existingDateTime: " + existingDateTime.format(formatter)); 
    System.out.println("Pyongyang existingDateTime: " 
      + existingDateTime.atZoneSameInstant(ZoneId.of("Asia/Pyongyang")) 
        .format(formatter)); 
    System.out.println("Singapore existingDateTime: " 
      + existingDateTime.atZoneSameInstant(ZoneId.of("Asia/Singapore")) 
        .format(formatter)); 

スニペットを実行しているからの出力は次のとおりです。

UTC existingDateTime: 2017-12-09 17:00:00 
Pyongyang existingDateTime: 2017-12-10 01:30:00 
Singapore existingDateTime: 2017-12-10 01:00:00 

これは私が(ヨーロッパ/ベルリンのタイムゾーンで)私のコンピュータに乗っ出力したが、それはの独立した近代的なクラスを維持する方が簡単ですJVMのタイムゾーンであるため、コンピュータで同じ出力を取得する必要があります。

EDIT:タイムゾーンの代わりにGMT + 09:00のオフセットを使用できないかどうかをコメントで尋ねました。私は本当の人々がタイムゾーンではなく、オフセットに住んでいるので、あなたがそれを行うことになるでしょう、なぜわからないんだけど、あなたはどのように知っているとき、それは簡単です:

System.out.println("GMT+09:00 existingDateTime: " 
      + existingDateTime.withOffsetSameInstant(ZoneOffset.ofHours(9)) 
        .format(formatter)); 

出力:

GMT+09:00 existingDateTime: 2017-12-10 02:00:00 

LocalDateTimeがありますタイムゾーンやオフセット情報のない日付と時刻文字列にオフセットまたはゾーンが含まれていないので、これを解析に使用します。あなたの日時がGMT + 0であると私は言ったので、オフセットUTCの最初のものを使ってOffsetDateTimeに変換します。そこから、異なるローカルタイムゾーンに変換するのは簡単です。だから私はいくつかのタイムゾーンで、毎回、私があなたがyyyy-MM-dd HH:mm:ss形式のような傾向があるので、私が解析するのに使ったのと同じフォーマッタを使って日時を書式設定することを実証します。

私はいつも地域/都市の形式でタイムゾーンを指定します。これは明白である(3つの略語とは異なり、例えばPYTはパラグアイ時間または平壌時間を意味する)。タイムゾーンがそのようなものを使用する場合、夏時間(DST)を自動的に処理します。ゾーンオフセットの歴史的な変更も組み込まれています。 Oracle Tutorial on Date Timeを参照し、常にjava.time答えを探してスタックオーバーフローに関連する質問、(時代遅れのクラスを使用して、古い回答の富があります、それらをスキップ)を検索し、java.timeを使用することを学ぶために

。ネット上のより多くの場所は貴重なリソースを保持します。あなたの検索エンジンと、良いものと貧しいものを区別する能力はあなたの友人です。

+0

v.vスニペットありがとうございました。私はどうですか? gmt + 09:00の代わりにzoneidが可能ですか? – user8012596

+0

もちろん、可能です。私の編集を参照してください。 @ user8012596 –

+1

ありがとうございます。理由は、私のデータベースではGMT-05:00と-05:00の両方で保管していたからです。だから、私はZoneOffset.ofHours(9)を使うべきです。 ZoneOffset.ofHours(-05:00)として使用できますか? – user8012596

関連する問題