次のような日付と時刻の文字列があります:2011-04-15T20:08:18Z
日付/時刻の形式についてはあまり詳しくありませんが、間違っていたら訂正していただければ、これが UTC 形式だと思います。
質問です: Java でこれをより通常の形式に解析する最も簡単な方法は何ですか?
ベストアンサー1
要約
String output =
Instant.parse ( "2011-04-15T20:08:18Z" )
.atZone ( ZoneId.of ( "America/Montreal" ) )
.format (
DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL )
.withLocale ( Locale.CANADA_FRENCH )
)
;
2011 年 4 月 15 日金曜日 16:08 EDT
詳細
のジョシュ・ピンターの回答正しいですが、さらに簡単にすることもできます。
java.time
Java 8以降では、バンドルされているjava.util.Date/Calendarクラスは、JSR310これらのクラスは、ジョダタイムただし、完全に再設計されています。
java.timeフレームワークはJoda-Timeの公式後継です。Joda-Timeの開発者は、できるだけ早くjava.timeに移行するようアドバイスしています。Joda-Timeは引き続き更新と調整が行われていますが、さらなる革新はjava.timeとその拡張機能でのみ行われます。スリーテンエクストラプロジェクト。
java.time機能の大部分はJava 6と7にバックポートされました。スリーテンバックポートプロジェクトは、Android向けにさらに適応され、スリーテンABPプロジェクト。
上記のJoda-Timeコードと同等のものは非常に似ています。概念は似ています。そしてJoda-Timeと同様に、java.timeクラスはデフォルトで8601 規格日時値のテキスト表現を解析/生成する際の形式。
アンInstant
タイムライン上の瞬間UTC決議によりナノ秒(対ミリ秒Joda-Time と java.util.Date によって使用されます。
Instant instant = Instant.parse( "2011-04-15T20:08:18Z" );
タイムゾーンを適用する(ZoneId
)を取得するにはZonedDateTime
。
ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
さらに別のタイムゾーンに調整します。
ZoneId zoneId_NewYork = ZoneId.of( "America/New_York" );
ZonedDateTime zdt_NewYork = zdt.withZoneSameInstant( zoneId_NewYork );
メソッド以外の形式で文字列を作成するにはtoString
、java.time.formatクラス。独自のフォーマットパターンを指定するか、java.timeが自動的にローカライズするようにすることができます。Locale
(a) 月名や曜日名の翻訳に使用される人間の言語、および (b) ピリオドとカンマ、部分の順序などの文化的規範。
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL );
formatter = formatter.withLocale( Locale.US );
String output = zdt_NewYork.format( formatter );
2011年4月15日金曜日午後4時8分18秒 EDT
についてjava.time
のjava.timeフレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い遺産日付と時刻のクラスjava.util.Date
、Calendar
、&SimpleDateFormat
。
のジョダタイムプロジェクト、現在メンテナンスモード、への移行を勧めているjava.timeクラス。
詳細については、Oracle チュートリアル. そして、Stack Overflowで多くの例と説明を検索してください。仕様はJSR310。
交換できますjava.timeオブジェクトをデータベースに直接接続します。JDBC ドライバー準拠JDBC 4.2またはそれ以降。文字列もクラスも必要ありませんjava.sql.*
。
java.time クラスはどこで入手できますか?
- Java SE 8、Java SE 9、Java SE 10、 以降
- 内蔵。
- バンドルされた実装を備えた標準 Java API の一部。
- Java 9 では、いくつかのマイナーな機能と修正が追加されています。
- Java SE 6そしてJava SE 7
- java.timeの機能の多くはJava 6と7にバックポートされています。スリーテンバックポート。
- アンドロイド
- Android バンドルの新しいバージョンでは、java.time クラスの実装がバンドルされています。
- 以前のAndroid(26未満)の場合、スリーテンABPプロジェクトは適応するスリーテンバックポート(上記参照)。ThreeTenABPの使い方…。
のスリーテンエクストラプロジェクトは、java.time に追加のクラスを追加して拡張します。このプロジェクトは、java.time に将来追加される可能性のある機能の実証の場です。ここでは、次のような便利なクラスが見つかるかもしれません。Interval
、YearWeek
、YearQuarter
、 そしてもっと。
ジョダタイム
アップデート:のジョダタイムプロジェクトは現在メンテナンスモードチームは、java.timeクラス。このセクションは履歴のためにそのまま残されています。
コンストラクタに文字列を渡す
ジョダタイムその文字列を直接受け取ることができます。日付時刻クラス。
Joda-Timeは標準を理解しているISO 8601 形式日付と時刻の形式を指定し、その形式をデフォルトとして使用します。
サンプルコード
以下は、Mac 上の Java 7 で実行されている Joda-Time 2.3 のコード例です。
DateTime コンストラクターに文字列を渡す方法を、タイム ゾーンありとなしの 2 つの方法で示します。タイム ゾーンを指定すると、日付と時刻の作業で発生する多くの問題が解決されます。指定しない場合は、デフォルトのタイム ゾーンが使用され、本番環境に導入したときに予期しない結果が生じる可能性があります。
また、タイムゾーンオフセットを指定しない方法も示します(UTC組み込み定数を使用して、GMTのタイム ゾーン (00:00) を指定します。末尾の (time の略)DateTimeZone.UTC
は、タイム ゾーンのオフセットなし (00:00) を意味します。Z
Zulu
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;
// Default time zone.
DateTime dateTime = new DateTime( "2011-04-15T20:08:18Z" );
// Specified time zone.
DateTime dateTimeInKolkata = new DateTime( "2011-04-15T20:08:18Z", DateTimeZone.forID( "Asia/Kolkata" ) );
DateTime dateTimeInNewYork = new DateTime( "2011-04-15T20:08:18Z", DateTimeZone.forID( "America/New_York" ) );
// In UTC/GMT (no time zone offset).
DateTime dateTimeUtc = dateTimeInKolkata.toDateTime( DateTimeZone.UTC );
// Output in localized format.
DateTimeFormatter formatter = DateTimeFormat.shortDateTime().withLocale( Locale.US );
String output_US = formatter.print( dateTimeInNewYork );
コンソールにダンプします…
System.out.println("dateTime: " + dateTime );
System.out.println("dateTimeInKolkata: " + dateTimeInKolkata );
System.out.println("dateTimeInNewYork: " + dateTimeInNewYork );
System.out.println("dateTimeUtc: " + dateTimeUtc );
System.out.println("dateTime in US format: " + output_US );
実行すると…
dateTime: 2011-04-15T13:08:18.000-07:00
dateTimeInKolkata: 2011-04-16T01:38:18.000+05:30
dateTimeInNewYork: 2011-04-15T16:08:18.000-04:00
dateTimeUtc: 2011-04-15T20:08:18.000Z
dateTime in US format: 4/15/11 4:08 PM