web-dev-qa-db-ja.com

日付文字列をいくつかのJava Object

私は、ファイルを読み取り、データを処理するプロジェクトで働いています。そこで、たとえば日付を扱うようになりました:

  1. 2012-01-10 23:13:26
  2. 2012年1月13日

パッケージJodaを見つけました。ちょっと面白いパッケージですが、それが一番簡単かどうかわかりません。

最初の例を解析して、DateTimeオブジェクト(Joda)の正規表現と文字列操作を行うことができました。 (例:スペースを '-'に置き換えて、コンストラクターに渡します。

new DateTime("2012-01-10 23:13:26".replace(' ', '-'))

うまくいったと思いますが、問題は2番目の形式にあります。このような入力を使用して、オブジェクト(できればJodaオブジェクト)を抽出するにはどうすればよいですか。私は確かにJodaがサポートする形式にフォーマットを変更する関数を書くことができますが、それを行う他の方法(ネイティブのJavaライブラリでさえ)もあるだろうかと思っていました。

ジョダよりも良いものがあれば、それも教えてください。

ありがとうございました。

31
Ziyan Junaideen

Joda-Timeを使用して、 DateTimeFormat を見てください。言及した両方の種類の日付文字列(および他のほとんどの任意の形式)を解析できます。ニーズがさらに複雑な場合は、 DateTimeFormatterBuilder を試してください。

#1を解析するには:

DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dateTime = f.parseDateTime("2012-01-10 23:13:26");

編集:実際には LocalDateTime はタイムゾーンのない日時に適したタイプです:

LocalDateTime dateTime = f.parseLocalDateTime("2012-01-10 23:13:26");

#2の場合:

DateTimeFormatter f = DateTimeFormat.forPattern("MMMM dd, yyyy");
LocalDate localDate = f.parseLocalDate("January 13, 2012");

そして、はい、Joda-Timeは、Java日付と時刻の処理に関する限り:)

ほとんどの人が同意するように、Jodaは非常にユーザーフレンドリーなライブラリです。たとえば、私はこれまでJodaでこの種の解析を行ったことはありませんでしたが、APIからそれを把握して記述するのに数分しかかかりませんでした。

アップデート(2015)

Java 8を使用している場合、ほとんどの場合、単に Java.time Joda-Timeの代わりに。これには、Jodaの優れたもの(または同等のもの)がほぼすべて含まれています。すでにJoda APIに精通している人には、Stephen Colebourneの Joda-TimeからJava.timeへの移行ガイド が便利です。

上記の例のJava.timeバージョンを以下に示します。

#1を解析するには:

DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.from(f.parse("2012-01-10 23:13:26"));

これをZonedDateTimeまたはOffsetDateTime(私の元の回答で使用されたJodaのDateTimeに相当するもの)に解析することはできませんが、解析された文字列にタイムゾーン情報がないため、そのような意味があります。

#2を解析するには:

DateTimeFormatter f = DateTimeFormatter.ofPattern("MMMM dd, yyyy");
LocalDate localDate = LocalDate.from(f.parse("January 13, 2012"));

ここで、LocalDateは解析するのに最も適切なタイプです(Joda-Timeと同様)。

39
Jonik

SimpleDateFormatは日付をJava Dateオブジェクトに解析します:

http://docs.Oracle.com/javase/1.4.2/docs/api/Java/text/SimpleDateFormat.html

SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); // first example
SimpleDateFormat format2 = new SimpleDateFormat("MMMMM dd,yyyy"); // second example

Date d1 = format1.parse( dateStr1 );
Date d2 = format2.parse( dateStr2 );
23
chubbsondubs

Jodaには、これを行うためのフォーマッターのようなものがあると思います。私は簡単なグーグル検索でこれを見つけました: http://johannburkard.de/blog/programming/Java/date-time-parsing-formatting-joda-time.html

DateTimeFormatter parser1 =
    DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z");

DateTimeFormatter parser2 =
    DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");

DateTime time = parser1.parseDateTime("<data>");

パターンの評価に使用される構文は、 X-Zeroのリンク にあります。

7

JodaTimeは、主にJava-の時刻処理の事実上の標準と考えられています。彼らは、Javaライブラリ(まあ、効果的に)。

文字列からJodaTimeの日付を取得するには、 DateTimeFormat クラスを調べます。

5
Clockwork-Muse

最も簡単なのは、期待する形式に従ってSimpleDateFormatを適切に設定し、その解析メソッドを使用してDateオブジェクトを提供することです。

2
rakche

tl; dr

LocalDateTime ldt = LocalDateTime.parse( "2012-01-10 23:13:26".replace( " " , "T" ) );

…そして…

LocalDate localDate = LocalDate.parse ( "January 13, 2012" , DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US ) );

詳細

Jonikによる回答 は基本的に正しいですが、いくつかの重要な問題を見逃しています。

Java.time

そこにジョダよりも良いものがあれば、私にも知らせてください。

はい、より良いものがあります Java.time フレームワーク。 Joda-Timeチームは、後継者としてJava.timeへの移行を推奨しています。

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、Java.util.Date.Calendar、およびJava.text.SimpleDateFormatなどの古い面倒な日時クラスに取って代わります。

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

Java.time機能の多くは、 ThreeTen-Backport でJava 6および7にバックポートされ、さらに ThreeTenABPでAndroidに適合します。

日付時刻

最初の入力は、日付と時刻です。 offset-from-UTC または time zone infoがないため、 LocalDateTime オブジェクトとして解析します。 「ローカル…」は、any局所性を意味し、特定の局所性はありません。したがって、それはタイムライン上の実際の瞬間ではなく、瞬間についての大まかなアイデアです。

入力文字列2012-01-10 23:13:26を解析するために、中間のSPACEをTに置き換えて、 ISO 8601 標準形式の日時値の標準スタイルに準拠させることができます。 。

Java.timeクラスは、日付時刻値のテキスト表現を解析および生成するときに、デフォルトでISO 8601形式を使用します。そのため、解析パターンを定義する必要はありません。

String input = "2012-01-10 23:13:26".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );

この値のコンテキストから目的のタイムゾーンがわかっている場合は、それを適用して、タイムライン上の実際の瞬間を定義します。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );

コンソールにダンプします。

System.out.println ( "input: " + input + " | zdt: " + zdt );

入力:2012-01-10T23:13:26 | zdt:2012-01-10T23:13:26-05:00 [アメリカ/モントリオール]

日付のみ

2番目の入力は、時刻とタイムゾーンのない日付のみの値です。そのためには LocalDate クラスが必要です。

この入力の形式は、米国の言語(英語)および文化的規範に準拠していると認識しています。したがって、フォーマットパターンを明示的に指定する必要はありません。 Locale を指定することで、そのUS形式を知っているフォーマッターを要求することができます。この形式の長さに応じて FormatStyle.LONG を指定します。

String input = "January 13, 2012";
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US );
LocalDate localDate = LocalDate.parse ( input , formatter );

コンソールにダンプします。

System.out.println ( "input: " + input + " | localDate: " + localDate );

入力:2012年1月13日| localDate:2012-01-13

1
Basil Bourque