カスタム タイムゾーンで日付を表示するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1166494

質問

次のような日付を表す文字列があるとします。

「2009 年 7 月 8 日水 17:08:48 GMT」

そこで、この文字列を次のように日付オブジェクトに解析します。

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);

これにより、正しい日付オブジェクトが得られます。次に、この日付を CDT 値として表示したいと思います。

多くのことを試してみましたが、正しく動作させることができません。これを機能させるには、DateFormat クラスを使用する単純なメソッドが必要です。何かアドバイス?私の最後の試みはこれでした:

formatter.setTimeZone(toTimeZone);
String result = formatter.format(fromDate);
役に立ちましたか?

解決

の代わりに "ZZZ" の "ZZZ" を使用: "Z" は、RFC822タイムゾーンのシンボルである

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");

は、日付/時刻のもので私の標準的なアドバイスがあるジョダ時間を、使用することである、と述べました完全に良くAPIます。

EDIT:短いが、完全なプログラム:

import java.text.*;
import java.util.*;

public class Test
{
    public List<String> names;

    public static void main(String [] args)
        throws Exception // Just for simplicity!
    {
        String fromDateString = "Wed Jul 08 17:08:48 GMT 2009";
        DateFormat formatter = new SimpleDateFormat
            ("EEE MMM dd HH:mm:ss zzz yyyy");
        Date fromDate = (Date)formatter.parse(fromDateString);
        TimeZone central = TimeZone.getTimeZone("America/Chicago");
        formatter.setTimeZone(central);
        System.out.println(formatter.format(fromDate));
    }
}

出力:水曜日7月8日12時08分48秒CDT 2009

他のヒント

使用します:

formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));

出力:

Wed Jul 08 12:08:48 CDT 2009

私のマシン上の例では、日付の。これは、フォーマット文字列にZZZ ZZZのために置き換えた後である。

古いスレッドを掘り起こすために申し訳ありません。一定のクラスとして、すべての時間帯-IDを保持するJavaクラスがある場合しかし、私は思っていました。 だからではなく、このように時間帯を設定しながら、ハードコードするタイムゾーンIDを持つ:

formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));

私たちは、代わりにもっと何か標準/ユニフォームをやっているだろう

formatter.setTimeZone(TimeZone.getTimeZone(SomeConstantClass.US_CENTRAL)); 

ここでSomeConstantClass.javaタイムゾーンクラスによってサポートされる異なるタイムゾーンIDに参照定数を保持するクラスである。

最新の方法は java.time クラスを使用するものです。

ZonedDateTime

入力文字列と一致する書式パターンを指定します。コードは次のようになります SimpleDateFormat しかし正確にはそうではありません。クラスドキュメントを必ず読んでください。 DateTimeFormatter. 。を指定することに注意してください。 Locale 曜日と月の名前にどの人間の言語を使用するかを決定します。

String input = "Wed Jul 08 17:08:48 GMT 2009";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" , Locale.ENGLISH );
ZonedDateTime zdt = ZonedDateTime.parse ( input , f );

zdt.toString():2009-07-08T17:08:48Z[GMT]

それを他のタイムゾーンに調整することができます。

を指定してください 適切なタイムゾーン名 の形式で continent/region. 。次のような 3 ~ 4 文字の略語は決して使用しないでください。 CDT または EST または IST これらは真のタイムゾーンではなく、標準化されておらず、一意(!)ですらないからです。

私はそれを推測します CDT あなたは次のようなタイムゾーンを意味していました America/Chicago.

ZoneId z = ZoneId.of( "America/Chicago" );
ZonedDateTime zdtChicago = zdt.withZoneSameInstant( z );

zdtChicago.toString() 2009-07-08T12:08:48-05:00[アメリカ/シカゴ]

Instant

一般に、UTC で作業するのが最適です。その抽出については、 Instant. 。の Instant クラスはタイムライン上の瞬間を表します。 UTC の解像度で ナノ秒 (小数点以下 9 桁まで)。

これ Instant class は、java.time の基本的な構成要素クラスです。考えられるのは ZonedDateTime として Instant プラス ZoneId.

Instant instant = zdtChicago.toInstant();

instant.toString():07/08/2009 17:08:48


java.timeについて

java.time フレームワークは Java 8 以降に組み込まれています。これらのクラスは、面倒な古いクラスに取って代わります。 遺産 日時クラスなど java.util.Date, .Calendar, & java.text.SimpleDateFormat.

ジョーダタイム プロジェクト、現在進行中 メンテナンスモード, 、java.timeへの移行を推奨します。

詳細については、を参照してください。 オラクルのチュートリアル. 。また、Stack Overflow で検索すると、多くの例や説明が得られます。仕様は JSR 310.

java.time クラスはどこで入手できますか?

  • Java SE8 そして SE9 以降
    • 内蔵。
    • 実装がバンドルされている標準 Java API の一部。
    • Java 9 では、いくつかのマイナーな機能と修正が追加されています。
  • Java SE6 そして SE7
  • アンドロイド

ThreeTen-Extra プロジェクトは追加のクラスで java.time を拡張します。このプロジェクトは、将来 java.time に追加される可能性があるための実験場です。ここで次のような便利なクラスを見つけることができます。 Interval, YearWeek, YearQuarter, 、 そして もっと.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top