37

ファイルを読み取り、データを処理するプロジェクトに取り組んでいます。そこで、たとえば日付を扱う必要がありました。

  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 ライブラリでさえも) があるかどうか疑問に思っていました。

Joda より優れたものがあれば、それも教えてください。

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

4

6 に答える 6

45

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");

そして、はい、Java の日付と時刻の処理に関する限り、Joda-Time は間違いなく進むべき道です。:)

ほとんどの人が同意するように、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 と同様)。

于 2012-01-13T17:43:06.590 に答える
24

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 );
于 2012-01-13T17:40:00.880 に答える
7

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 のリンクにあります。

于 2012-01-13T17:42:52.753 に答える
5

JodaTime は、Java での日時処理のデファクト スタンダードと見なされています。JodaTime は、Java ライブラリの次のバージョンに (まあ、効果的に) それを追加しようと取り組んでいます。

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

于 2012-01-13T17:42:10.453 に答える
2

tl;dr

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

…そして…</p>

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

詳細

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

java.time

Joda より優れたものがあれば、それも教えてください。

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

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

詳細については、 Oracle チュートリアルを参照してください。また、Stack Overflow で多くの例と説明を検索してください。

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

日付時刻

最初の入力は、日付と時刻です。UTCからのオフセットまたはタイム ゾーン情報がないため、オブジェクトとして解析しLocalDateTimeます。「Local…」は特定の地域ではなく、任意の地域を意味します。したがって、これはタイムライン上の実際の瞬間ではなく、その瞬間についての大まかな考えにすぎません。

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

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クラスが必要です。

その入力の形式は、米国の言語 (英語) および文化的規範に準拠していると認識しています。したがって、書式設定パターンを明示的に指定する必要はありません。を指定することで、その US 形式を認識しているフォーマッタを簡単に要求できますLocaleFormatStyle.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

于 2016-07-17T05:32:22.873 に答える
2

最も簡単なのは、期待するフォーマットに従って SimpleDateFormat を適切に設定し、その解析メソッドを使用して Date オブジェクトを取得することです

于 2012-01-13T17:43:25.083 に答える