パターンyyyy-MM-dd hh:mm aの文字列があり、上記の文字列が日付を表すタイムゾーンオブジェクトを個別に取得できます。
これを以下の形式に変換します。 yyyy-MM-dd HH:mm:ss Z
これどうやってするの?
yyyy-MM-dd HH:mm:ss
で SimpleDateFormat を使用し、 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
を出力します
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クラスに取って代わられた、面倒な古い日時クラス(Date
、Calendar
など)が使用されます。
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/Paris
や America/Montreal
などのタイムゾーンのコンテキストがない場合、「真夜中の数分後」と言っても意味がありません。
ZoneId
上記の文字列が日付を表すタイムゾーンオブジェクトを個別に取得できます。
タイムゾーンは ZoneId
クラスで表されます。
適切なタイムゾーン名 を、 continent/region
、 America/Montreal
、Africa/Casablanca
などのPacific/Auckland
の形式で指定します。 EST
やIST
などの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 8以降に組み込まれています。これらのクラスは、面倒な古い legacy のような日時クラスに取って代わります- Java.util.Date
、 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 Interval
、 YearWeek
、 YearQuarter
などの便利なクラスがあります。 、および more 。
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);
間違いなく、一般的に使用される形式は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"を使用する必要がある理由はわかりません。プログラムは失敗します。
日付パターンを使用して SimpleDateFormat の新しいインスタンスを作成します。その後、その解析メソッドを呼び出して、日付文字列をJava.util.Dateオブジェクトに変換できます。