web-dev-qa-db-ja.com

Joda Time:StringをLocalDateに変換する方法は?

フォーマット文字列を指定して、日付だけを文字列から変換する方法。私の場合、日付部分のみが関連します

DateTimeとして構築すると失敗します:

String dateString = "2009-04-17";
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dateTime = formatter.parseDateTime(dateString);

エラーJava.lang.IllegalArgumentException: Invalid format: "2011-04-17" is too shortあり

おそらく、代わりにLocalDateを使用する必要があるためです。しかし、LocalDateのフォーマッターは表示されません。 String dateString = "2009-04-17";LocalDate(またはそれが正しい表現でない場合は他の何か)に変換する最良の方法は何ですか

ありがとう...

44
bsr

おそらく LocalDate(Object) を探しているでしょう。汎用のObjectを使用するため、少し混乱しますが、ドキュメントでは、ConverterManagerの処理方法を知っている String を使用することを示しています。 Stringをコンストラクタに渡すと、たとえば.

LocalDate myDate = new LocalDate("2010-04-28");
52
Hank Gay

parse(String)メソッドを使用します。

LocalDate date = LocalDate.parse("2009-04-17");
19
JodaStephen

LocalDate.parse()またはnew LocalDate()の使用には、やや微妙なバグのような問題があります。コードスニペットは1000語に相当します。 scala replの次の例では、ローカル日付を文字列形式yyyyMMddで取得したかった。LocalDate.parse()はLocalDateのインスタンスを提供してくれるが、それは正しいものではありません(new LocalDate()は同じ動作をします):

_scala> org.joda.time.LocalDate.parse("20120202")
res3: org.joda.time.LocalDate = 20120202-01-01
_

私はそれをyyyyMMddの形式で2016年2月2日に渡し、20120202年1月1日の日付を返します。私はここで四肢に出かけています。これがそうすべきだとは思いません。 Jodaは 'yyyy-MM-dd'をデフォルトとして使用しますが、その年の1月1日が必要だと思って、暗黙的に '-'文字のない文字列を受け入れますか?それは私にとって合理的なデフォルトの動作とは思えません。

これを考えると、簡単にだまされないjoda日付フォーマッタを使用することは、文字列を解析するためのより良いソリューションであるように思えます。さらに、日付形式が「yyyy-MM-dd」でない場合、LocalDate.parse()はおそらく例外をスローするはずです。

_scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyyMMdd")
format: org.joda.time.format.DateTimeFormatter = org.joda.time.format.DateTimeFormatter@56826a75

scala> org.joda.time.LocalDate.parse("20120202", format)
res4: org.joda.time.LocalDate = 2012-02-02
_

これにより、他のフォーマットが失敗するため、この奇妙なバグのある動作は発生しません。

_scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd")
format: org.joda.time.format.DateTimeFormatter = org.joda.time.format.DateTimeFormatter@781aff8b

scala> org.joda.time.LocalDate.parse("20120202", format)
Java.lang.IllegalArgumentException: Invalid format: "20120202" is too short
  at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.Java:900)
  at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.Java:844)
  at org.joda.time.LocalDate.parse(LocalDate.Java:179)
  ... 65 elided
_

これは、20120202年の日付を返すよりもはるかに正気な動作です。

9
Kevin Won

私の場合、着信文字列は2つの形式のいずれかになります。そこで、最初に、より具体的な形式で文字列を解析しようとします。

String s = "2016-02-12";
LocalDateTime ldt;
try {
    ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd HH:mm"));
}
catch (IllegalArgumentException e) {
    ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd"));
}
4
Mikhail Batcer

これは私のために働いた:

LocalDate d1 = LocalDate.parse("2014-07-19");
LocalDate dNow = LocalDate.now();  // Current date
1
CharlesF

LocalDate.ofを使用して、年、月、日を個別の引数として渡すことができます。

LocalDate date1 = LocalDate.of(2009, 4, 17);
LocalDate date2 = LocalDate.of(2009, Month.APRIL, 17);
1
Computered