LocalDateへの文字列


102

文字列をに変換するにはどうすればよいLocalDateですか?

私は次のような例を見てきました:

LocalDate dt = new LocalDate("2005-11-12");

しかし、私の文字列は次のようなものです:

2005-nov-12

回答:


78

Joda Timeを使用するときは、以下を使用する必要がありますDateTimeFormatter

final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MMM-dd");
final LocalDate dt = dtf.parseLocalDate(yourinput);

Java 8以降を使用している場合は、hertziの回答を参照してください


「yyyy-MMM-dd」形式の編集も提出しました。YYYYは年号であり、DDは年号です。
Spencer Kormos

答えは少し間違っています... joda時間の場合、使用するクラスはDateTimeFormatterではなく、DateTimeFormatです。つまり、DateTimeFormat.ofPattern( "yyyy-MM-dd")。parseLocalDate(yourInput);を呼び出します。
Dan Haywood

188

java.time

Java 1.8以降では、java.timeクラスを使用することにより、追加のライブラリなしでこれを実現できます。チュートリアルを参照してください。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd");
formatter = formatter.withLocale( putAppropriateLocaleHere );  // Locale specifies human language for translating, and cultural norms for lowercase/uppercase and abbreviations and such. Example: Locale.US or Locale.CANADA_FRENCH
LocalDate date = LocalDate.parse("2005-nov-12", formatter);

構文はほぼ同じですが。


java.time.format.DateTimeParseException:インデックス5でテキスト「2005-nov-12」を解析できませんでした
Atte Juvonen

3
これは、デフォルトのロケールが「Nov」の「N」が大文字であることを想定しているために発生します。
hertzi

このアプローチの詳細については、同様の質問に対する私の回答を参照しください。
バジルブルク

14

DateTimeからLocalDateに移動する必要がある場合があります。

Joda Timeの使用:

DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MMM-dd");
DateTime dateTime = FORMATTER.parseDateTime("2005-nov-12");
LocalDate localDate = dateTime.toLocalDate();

2
この回答はJava SEではなくJodaを指していることに注意してください。
DavidS

9

日時の書式設定はによって実行されますorg.joda.time.format.DateTimeFormatter class。3つのクラスがフォーマッタを作成するためのファクトリメソッドを提供します。これは1つです。その他はISODateTimeFormatDateTimeFormatterBuilderです。

DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MMM-dd");
LocalDate lDate = new LocalDate().parse("2005-nov-12",format);

final org.joda.time.LocalDate classタイムゾーンなしの日付表す不変の日時クラスです。LocalDateあるスレッドセーフで不変という、提供年表は同様です。提供されているすべての標準の年表クラスは、スレッドセーフで不変です。


1

DateTimeFormatter には、文字シーケンスを解析するために直接使用できる組み込みのフォーマットがあります。これは大文字と小文字が区別されるため、11月は機能しますが、11月は機能しません。NOVは機能しません。

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MMM-dd");

try {
    LocalDate datetime = LocalDate.parse(oldDate, pattern);
    System.out.println(datetime); 
} catch (DateTimeParseException e) {
    // DateTimeParseException - Text '2019-nov-12' could not be parsed at index 5
    // Exception handling message/mechanism/logging as per company standard
}

DateTimeFormatterBuilderフォーマッターを作成するカスタム方法を提供します。大文字と小文字が区別されないため、11月、11月、11月、11月は同じように扱われます。

DateTimeFormatter f = new DateTimeFormatterBuilder().parseCaseInsensitive()
        .append(DateTimeFormatter.ofPattern("yyyy-MMM-dd")).toFormatter();
try {
    LocalDate datetime = LocalDate.parse(oldDate, f);
    System.out.println(datetime); // 2019-11-12
} catch (DateTimeParseException e) {
     // Exception handling message/mechanism/logging as per company standard
}

1
SOへようこそ。ご意見をお寄せいただきありがとうございます。回答を編集して、もう少し説明を加えてください。それが質問とどのように関連しているか、ソリューションをどこから入手したのか、なぜ機能するのですか?より多くのガイダンスを参照してくださいstackoverflow.com/help/how-to-answer
リアン- B
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.