フォーマット文字列を指定して、日付だけを文字列から変換する方法。私の場合、日付部分のみが関連します
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
(またはそれが正しい表現でない場合は他の何か)に変換する最良の方法は何ですか
ありがとう...
おそらく LocalDate(Object)
を探しているでしょう。汎用のObject
を使用するため、少し混乱しますが、ドキュメントでは、ConverterManager
の処理方法を知っている String
を使用することを示しています。 String
をコンストラクタに渡すと、たとえば.
LocalDate myDate = new LocalDate("2010-04-28");
parse(String)
メソッドを使用します。
LocalDate date = LocalDate.parse("2009-04-17");
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年の日付を返すよりもはるかに正気な動作です。
私の場合、着信文字列は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"));
}
これは私のために働いた:
LocalDate d1 = LocalDate.parse("2014-07-19");
LocalDate dNow = LocalDate.now(); // Current date
LocalDate.of
を使用して、年、月、日を個別の引数として渡すことができます。
LocalDate date1 = LocalDate.of(2009, 4, 17);
LocalDate date2 = LocalDate.of(2009, Month.APRIL, 17);