Jon Skeet’s answerは正しく、それはしかし、2013年
で書かれた良い答えだった、誰かがで同様の問題を得たので、もし、あなたの質問、SimpleDateFormat
とDate
に使用するクラスは、今長い時代遅れですそれらの今日、IMHO最も良い答えはthe modern Java date & time APIを使用するように変更することです。
すみませんが、私はScalaコードを書くことができませんので、Javaで生活しなければなりません。私は使用しています
private static DateTimeFormatter parseFormatter
= DateTimeFormatter.ofPattern("MM/dd/yyyy");
フォーマットパターンの文字は、意味は少し異なりますが、あなたの質問と同じです。 DateTimeFormatter
はパターン文字の文字数を文字通りとみなしています。今、私たちは試してみてください。
System.out.println(LocalDate.parse(date, parseFormatter));
結果:
"03/11/2013"
を期待通りに2013-03-11
に解析されます。私は現代のLocalDate
クラスを使用しました。時刻を持たない日付を表すクラスです。正確にここで必要なクラスです。
"03/88/2013 hjhkjhk"
を渡すと、メッセージText '03/88/2013 hjhkjhk' could not be parsed, unparsed text found at index 10
のDateTimeParseException
が得られます。かなり正確ですね。現代のAPIには、文字列の一部のみを解析するメソッドがあります。
"03/88/201309"
は、Text '03/88/201309' could not be parsed at index 6
となる。私たちは4桁の年を求め、それに6桁を与えました。これが反対につながります。明らかに、このエラーを検出して報告してから、88日を月として解釈しようとしています。
- でも、8831の月の日には反対ですが、
"03/88/2013"
はText '03/88/2013' could not be parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 88
です。再度、メッセージがどの程度有益であるかお楽しみください。
"03-08-2013"
(スラッシュの代わりにハイフンを使用)はText '03-08-2013' could not be parsed at index 2
ですが、あまり驚くことではありません。インデックス2は、最初のハイフンがある場所です。
Jon Skeetは、古くなったSimpleDateFormat
は、寛大でも寛大でもないと説明しました。これはDateTimeFormatter
でも当てはまりますが、実際には 'lenient'、 'smart'、 'strict'という2つのリゾルバスタイルの代わりに3つのスタイルがあります。しかし、多くのプログラマーがこれを認識していないので、彼らはデフォルトの「寛大な」(スマートな)ものではないという良い選択をしたと思います。
フォーマッタを寛容にしたいのですが?
private static DateTimeFormatter parseFormatter
= DateTimeFormatter.ofPattern("MM/dd/yyyy")
.withResolverStyle(ResolverStyle.LENIENT);
今も2013-05-27
に、"03/88/2013"
を解析します。私はこれが古いクラスもやったと思う:3月初めから88日を計算すると5月27日になる。他のエラーメッセージはまだ同じである。つまり、解析されていないテキスト、6桁の年、ハイフンには依然として反対します。
質問:私のJavaバージョンで最新のAPIを使用できますか?
少なくともJava を使用している場合は、可能です。
'var date'?私はそうは思わない、質問にあなたの実際のコードをコピーしてください。 – Perception
'var date'はJavaではありません。 –
@Lutzホーン。私はscalaを使用しています – Rishi