SimpleDateFormatとDateを使用して従来のコードを置き換えようとすると、java.time.DateTimeFormatterとLocalDateを使用するときに問題が発生しました。 2つの日付形式は同等ではありません。この時点で、私は2つの日付の種類が同じではないことを知っていなければなりませんが、私が考えているシナリオは時間の面を気にしないので、無視することができます。同じパターンがてDateTimeFormatterあなたはSDFのと同等の日付を見ることを期待したいヌルを生成するまでの両端フォーマッタで使用されるとき、あなたが見ることができるようにSimpleDateFormatをDateTimeFormatterに変換する
public Date getDate(String value) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
try {
return dateFormat.parse(value);
} catch (ParseException e) {
return null;
}
}
public LocalDate getLocalDate(String value) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
try {
return LocalDate.parse(value, formatter);
} catch (DateTimeParseException e) {
return null;
}
}
public void testDates() {
getDate("03/07/2016"); // Sun Jul 03 00:00:00 BST 2016
getDate("3/7/2016"); // Sun Jul 03 00:00:00 BST 2016
getDate("3/7/2016 00:00:00"); // Sun Jul 03 00:00:00 BST 2016
getDate("3/7/2016 00:00:00.0+0100"); // Sun Jul 03 00:00:00 BST 2016
getDate("3/7/2016T00:00:00.0+0100"); // Sun Jul 03 00:00:00 BST 2016
getLocalDate("03/07/2016"); // 2016-07-03
getLocalDate("3/7/2016"); // null
getLocalDate("3/7/2016 00:00:00"); // null
getLocalDate("3/7/2016 00:00:00.0+0100"); // null
getLocalDate("3/7/2016T00:00:00.0+0100"); // null
}
。このシナリオでは、不要なデータは削除されると予想しますが、そうではありません。
堅牢な日付/時刻パーサーを作成するにはどうすればいいですか?
私は 'DD/MM/yyyy'は明らかに月の日に2桁、月2桁、年のために4桁の数字を必要とするため、' SimpleDateFormat'は、より堅牢ではないと思います。入力がこの要件と一致しない場合、フレームワークは解析例外を発生させる必要があります。ユーザーの要件と異なる変換を行うことは危険です。 –
はいSDFが壊れましたが、コードはこれに依存しています。ですから一般的に私はAPIが固定フォーマットでなければならないと完全に同意しますが、このシナリオではファイルを解析していて、人々はさまざまなフォーマットで日付を提供することができます。コードはそれらをすべて満たす必要があります。明らかに、これは直面している問題の抜粋に過ぎません。実際には日付順やセパレータの周りにはたくさんのチェックがあります。 – Remlap21