カスタム タイムゾーンで日付を表示するにはどうすればよいですか?
-
19-09-2019 - |
質問
次のような日付を表す文字列があるとします。
「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
- java.time 機能の多くは、Java 6 および 7 にバックポートされています。 ThreeTen バックポート.
- アンドロイド
の ThreeTen-Extra プロジェクトは追加のクラスで java.time を拡張します。このプロジェクトは、将来 java.time に追加される可能性があるための実験場です。ここで次のような便利なクラスを見つけることができます。 Interval
, YearWeek
, YearQuarter
, 、 そして もっと.