Java 8を使用して日付を解析し、2つの日付の違いを見つけています。
これが私のスニペットです。
String date1 ="01-JAN-2017";
String date2 = "02-FEB-2017";
DateTimeFormatter df = DateTimeFormatter .ofPattern("DD-MMM-YYYY", en);
LocalDate d1 = LocalDate.parse(date1, df);
LocalDate d2 = LocalDate.parse(date2, df);
Long datediff = ChronoUnit.DAYS.between(d1,d2);
実行するとエラーが発生します:
Java.time.format.DateTimeParseException:インデックス3でテキストを解析できませんでした
次のコードが機能します。問題は、「Jan」ではなく「JAN」を使用していることです。 DateTimeFormatterは、そのように認識しません。また、パターンを「d-MMM-yyyy」に変更します。
String date1 ="01-Jan-2017";
String date2 = "02-Feb-2017";
DateTimeFormatter df = DateTimeFormatter.ofPattern("d-MMM-yyyy");
LocalDate d1 = LocalDate.parse(date1, df);
LocalDate d2 = LocalDate.parse(date2, df);
Long datediff = ChronoUnit.DAYS.between(d1,d2);
ソース: https://www.mkyong.com/Java8/Java-8-how-to-convert-string-to-localdate/
まず、 javadocを確認してください 。大文字のD
はday-of-yearフィールド(day-of- month必要に応じて)、大文字のY
はweek-based-yearフィールド( yearではなく))。正しいパターンは、小文字のd
およびy
です。
また、大文字の月名(JAN
およびFEB
)を使用しているため、フォーマッタは大文字と小文字を区別しない(デフォルトの動作では、Jan
やFeb
などの値のみを受け入れます)。また、これらの月名は英語の略語であるため、英語ロケールを使用して名前を正しく解析することも確認する必要があります(Java.util.Locale
クラス)。
したがって、フォーマッタは次のように作成する必要があります。
DateTimeFormatter df = new DateTimeFormatterBuilder()
// case insensitive to parse JAN and FEB
.parseCaseInsensitive()
// add pattern
.appendPattern("dd-MMM-yyyy")
// create formatter (use English Locale to parse month names)
.toFormatter(Locale.ENGLISH);
これにより、コードが機能します(そしてdatediff
は32
)。
このワイルドカードを使用できるかもしれませんが、
String d2arr[] = {
"2016-12-21",
"1/17/2016",
"1/3/2016",
"11/23/2016",
"OCT 20 2016",
"Oct 22 2016",
"Oct 23", // default year is 2016
"OCT 24", // default year is 2016
};
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder()
.parseCaseInsensitive().parseLenient()
.parseDefaulting(ChronoField.YEAR_OF_ERA, 2016L)
.appendPattern("[yyyy-MM-dd]")
.appendPattern("[M/dd/yyyy]")
.appendPattern("[M/d/yyyy]")
.appendPattern("[MM/dd/yyyy]")
.appendPattern("[MMM dd yyyy]");
DateTimeFormatter formatter2 = builder.toFormatter(Locale.ENGLISH);
https://coderanch.com/t/677142/Java/DateTimeParseException-Text-parsed-unparsed-textリンクの説明をここに入力
// DateTimeFormatterBuilder provides custom way to create a
// formatter
// It is Case Insensitive, Nov , nov and NOV will be treated same
DateTimeFormatter f = new DateTimeFormatterBuilder().parseCaseInsensitive()
.append(DateTimeFormatter.ofPattern("yyyy-MMM-dd")).toFormatter();
try {
LocalDate datetime = LocalDate.parse("2019-DeC-22", f);
System.out.println(datetime); // 2019-12-22
} catch (DateTimeParseException e) {
// Exception handling message/mechanism/logging as per company standard
}