私は、ファイルを読み取り、データを処理するプロジェクトで働いています。そこで、たとえば日付を扱うようになりました:
パッケージJodaを見つけました。ちょっと面白いパッケージですが、それが一番簡単かどうかわかりません。
最初の例を解析して、DateTimeオブジェクト(Joda)の正規表現と文字列操作を行うことができました。 (例:スペースを '-'に置き換えて、コンストラクターに渡します。
new DateTime("2012-01-10 23:13:26".replace(' ', '-'))
うまくいったと思いますが、問題は2番目の形式にあります。このような入力を使用して、オブジェクト(できればJodaオブジェクト)を抽出するにはどうすればよいですか。私は確かにJodaがサポートする形式にフォーマットを変更する関数を書くことができますが、それを行う他の方法(ネイティブのJavaライブラリでさえ)もあるだろうかと思っていました。
ジョダよりも良いものがあれば、それも教えてください。
ありがとうございました。
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からそれを把握して記述するのに数分しかかかりませんでした。
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と同様)。
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 );
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のリンク にあります。
JodaTimeは、主にJava-の時刻処理の事実上の標準と考えられています。彼らは、Javaライブラリ(まあ、効果的に)。
文字列からJodaTimeの日付を取得するには、 DateTimeFormat クラスを調べます。
最も簡単なのは、期待する形式に従ってSimpleDateFormatを適切に設定し、その解析メソッドを使用してDateオブジェクトを提供することです。
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 フレームワーク。 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