web-dev-qa-db-ja.com

Java SimpleDateFormatコロンで区切られた分でのタイムゾーンオフセット

SimpleDateFormatを使用して日付を2012-11-25T23:50:56.193+01:00の形式で取得するにはどうすればよいですか?
Zを次のような形式で使用した場合

yyyy-MM-dd'T'hh:mm:ss.SSSZ

その後、それは示しています

2013-03-06T11:49:05.490+0100

18
user2139437

Java 7+01:00)のSimpleDateFormatまたはJoda 'を使用して、yyyy-MM-dd'T'HH:mm:ss.SSSXXXのような形式のタイムゾーンオフセットを取得できます。 sDateTimeFormatyyyy-MM-dd'T'HH:mm:ss.SSSZZ)。

37
ejain

こちらが2017年の回答です。できる方法がある場合(ある方法)、SimpleDateFormatのような古いクラスを破棄し、最新の便利なクラスを _Java.time_ で使用します。特に、希望する形式_2012-11-25T23:50:56.193+01:00_はISO-8601に準拠しているため、新しいクラスをそのまま使用できます。OffsetDateTime.toString()を使用するだけです。

_    OffsetDateTime time = OffsetDateTime.now();
    System.out.println(time.toString());
_

これは次のようなものを印刷します

_2017-05-10T16:14:20.407+02:00
_

ただし、知っておくとよいことは1つありますが、OffsetDateTimeオブジェクトの精度を出力するのに必要な秒数で、小数点以下3桁のグループを出力します。どうやら私のコンピューターでは、「今」はミリ秒(小数点以下3桁の秒)の精度で表示されます。

古いDateオブジェクトがある場合、たとえば、レガシーメソッドの呼び出しから取得した場合、最初に行うことは、それをInstantに変換することです。これは、現代のクラス。そこから、要件に応じて他の変換を簡単に行うことができます。

_    Date now = new Date();
    OffsetDateTime time = now.toInstant().atZone(ZoneId.systemDefault()).toOffsetDateTime();
    System.out.println(time.toString());
_

私は本当に必要以上の変換を行っています。 atZone(ZoneId.systemDefault())ZonedDateTimeを生成しましたが、そのtoString()は必ずしも希望どおりの形式を提供するとは限りません。ただし、簡単にフォーマットできます。

_    ZonedDateTime time = now.toInstant().atZone(ZoneId.systemDefault());
    System.out.println(time.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
_
2
Ole V.V.