web-dev-qa-db-ja.com

タイムゾーンを使用して文字列を日付に変換する

パターンyyyy-MM-dd hh:mm aの文字列があり、上記の文字列が日付を表すタイムゾーンオブジェクトを個別に取得できます。

これを以下の形式に変換します。 yyyy-MM-dd HH:mm:ss Z

これどうやってするの?

16
John

yyyy-MM-dd HH:mm:ssSimpleDateFormat を使用し、 TimeZone を明示的に設定できます。

public static Date getSomeDate(final String str, final TimeZone tz)
    throws ParseException {
  final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm a");
  sdf.setTimeZone(tz);
  return sdf.parse(str);
}

/**
 * @param args
 * @throws IOException
 * @throws InterruptedException
 * @throws ParseException
 */
public static void main(final String[] args) throws ParseException {
  final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
  System.out.println(sdf.format(getSomeDate(
      "2010-11-17 01:12 pm", TimeZone.getTimeZone("Europe/Berlin"))));
  System.out.println(sdf.format(getSomeDate(
      "2010-11-17 01:12 pm", TimeZone.getTimeZone("America/Chicago"))));
}

プリントアウト:

2010-11-17 13:12:00 +0100

2010-11-17 20:12:00 +0100

2010-12-01の更新:特別なTimeZoneを明示的に印刷する場合は、SimpleDateFormatで設定します。

sdf.setTimeZone(TimeZone .getTimeZone("IST")); 
System.out.println(sdf.format(getSomeDate(
    "2010-11-17 01:12 pm", TimeZone.getTimeZone("IST"))));

2010-11-17 13:12:00 +0530を出力します

22

tl; dr

LocalDateTime.parse(                        // Parse string as value without time zone and without offset-from-UTC.
    "2017-01-23 12:34 PM" , 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd hh:mm a" )
)                                           // Returns a `LocalDateTime` object.
.atZone( ZoneId.of( "America/Montreal" ) )  // Assign time zone, to determine a moment. Returns a `ZonedDateTime` object.
.toInstant()                                // Adjusts from zone to UTC.
.toString()                                 // Generate string: 2017-01-23T17:34:00Z
.replace( "T" , " " )                       // Substitute SPACE for 'T' in middle.
.replace( "Z" , " Z" )                      // Insert SPACE before 'Z'.

レガシーの日時クラスを避ける

他のアンサーでは、Java.timeクラスに取って代わられた、面倒な古い日時クラス(DateCalendarなど)が使用されます。

LocalDateTime

Yyyy-MM-dd hh:mm aというパターンの文字列があります

このような入力文字列には、UTCからのオフセットまたはタイムゾーンの表示がありません。したがって、 LocalDateTime として解析します。

DateTimeFormatter オブジェクトを使用して入力と一致するフォーマットパターンを定義します。

String input = "2017-01-23 12:34 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd hh:mm a" );
LocalDateTime ldt = LocalDateTime.parse( input , f );

ldt.toString():2017-01-23T12:34

LocalDateTimeは特定の瞬間ではなくであり、可能な瞬間の範囲についての漠然とした考えにすぎないことに注意してください。たとえば、パリの真夜中から数分後、フランスはまだモントリオールの「昨日」です。 Europe/ParisAmerica/Montreal などのタイムゾーンのコンテキストがない場合、「真夜中の数分後」と言っても意味がありません。

ZoneId

上記の文字列が日付を表すタイムゾーンオブジェクトを個別に取得できます。

タイムゾーンは ZoneId クラスで表されます。

適切なタイムゾーン名 を、 continent/regionAmerica/MontrealAfrica/CasablancaなどのPacific/Aucklandの形式で指定します。 ESTISTなどの3〜4文字の略語は、not真のタイムゾーンであり、標準化されておらず、一意でもない(!)。

ZoneId z = ZoneId.of( "America/Montreal" );

ZonedDateTime

ZoneIdを適用して ZonedDateTime を取得します。これは実際にタイムライン上のポイントであり、履歴の特定の瞬間です。

ZonedDateTime zdt = ldt.atZone( z );

zdt.toString():2017-01-23T12:34-05:00 [アメリカ/モントリオール]

Instant

これを以下の形式に変換したいです。 yyyy-MM-dd HH:mm:ss Z

まず、Zリテラル文字はZuluの短縮形であり、 [〜#〜] utc [〜#〜] を意味することを知ってください。つまり、 offset-from-UTC ゼロ時間、+00:00

Instant クラスは、 [〜#〜] utc [〜#〜] のタイムライン上の瞬間を表します。解像度は nanoseconds (小数部の最大9桁)。

InstantからZonedDateTimeオブジェクトを抽出できます。

Instant instant = zdt.toInstant();  // Extracting the same moment but in UTC.

2017-01-22T18:21:13.354Zなどの標準 ISO 8601 形式で文字列を生成するには、toStringを呼び出します。標準形式にはスペースがなく、Tを使用して年月日を時分秒から区切り、Zを標準のゼロオフセットに追加します。

String output = instant.toString();

instant.toString():2017-01-23T17:34:00Z

可能な限り標準形式を使用することを強くお勧めします。指定した形式のようにスペースを使用する場合は、 DateTimeFormatter オブジェクトで独自のフォーマットパターンを定義するか、 Instant::toStringの出力で文字列操作を行います。

String output = instant.toString()
                       .replace( "T" , " " )  // Substitute SPACE for T.
                       .replace( "Z" , " Z" ); // Insert SPACE before Z.

出力:2017-01-23 17:34:00 Z

これを試してください code in IdeOne.com


Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacy のような日時クラスに取って代わります- Java.util.DateCalendar 、& SimpleDateFormat

Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。

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

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuarter などの便利なクラスがあります。 、および more

10
Basil Bourque

SimpleDateFormat を使用します

String string1 = "2009-10-10 12:12:12 ";
SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z")
sdf.setTimeZone(tz);
Date date = sdf.parse(string1);
5
Jigar Joshi

間違いなく、一般的に使用される形式は2014-10-05T15:23:01Z(TZ)

そのためには、このコードを使用する必要があります

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
String dateInString = "2014-10-05T15:23:01Z";

 try {

     Date date = formatter.parse(dateInString.replaceAll("Z$", "+0000"));
     System.out.println(date);

 } catch (ParseException e) {
     e.printStackTrace();
 }

その出力は、Sun 2014年10月5日20:53:01 IST 2014です。

ただし、replaceAllを追加しない場合、replaceAll "Z"を使用する必要がある理由はわかりません。プログラムは失敗します。

0
Somum

日付パターンを使用して SimpleDateFormat の新しいインスタンスを作成します。その後、その解析メソッドを呼び出して、日付文字列をJava.util.Dateオブジェクトに変換できます。

0
Robert