2017-09-29 5 views
-3

私はDate fieldを入力パラメータとする方法があります。私が何をしたか日付ゼロの検証Javaで

public static String formatDate(Date inputDate) { 
    // if user send the date with inputDate= new Date(00000000) or new Date(0L) because it is Java default date. 
    I have to send the exception error with message Invalid date. 
} 

として以下のものです、しかし、私はinputDateパラメータとしてゼロカウントからエポック「新日(0L)」のようなの無効な日付を通過する間にエラーを取得することができません。

public static String formatDate(Date inputDate) { 
    if (null == inputDate) 
     throw new FieldFormatException("Empty date field."); 

    try { 
     SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); 
     return formatter.format(inputDate); 
    } catch (Exception ex) { 
     throw new FieldFormatException("Exception in formatting date field." + ex); 
    } 
} 
+1

「inputDate = 00000000で日付を送信した場合」は意味がありません。「inputDate」は「String」ではなく「Date」です。 –

+0

私が意味するのは '新しい日付(0L)'または8つの長さ0の値です。 '19700101'に変換するのではなく、無効な日付です。 –

+2

そうです、それは*非常に、非常に*不明でした。単に 'Date.getTime()'を呼び出して、それが0を返すかどうかを確認するのはなぜですか? –

答えて

1

あなただけしたいように聞こえる:inputDateがnullであるか、Unixエポックを表す場合に検出します

if (inputDate == null || inputDate.getTime() == 0L) 

しかしコメントで述べたように:単一の値を拒否

  • はちょっと危険である - なぜnew Date(0)「間違った」ですが、new Date(1)「右」?
  • これはスキートによって受け入れ答えが正しいUnixエポック
+1

これは、1つの日付値をチェックするという非常に恐ろしい匂いがあり、 'new Date(1)'だけで簡単に迂回することができることに気づく価値があると思います。私がこのような質問を開発者から得るとき、私は通常戻って "なぜあなたはその一つの価値を気にしていますか"と尋ねる必要があります。答えはほとんど常に彼らがその1つの価値以上を気にしているということです。 – gnomed

+0

1970年1月1日00:00に入力された日付が正確にある人がいる場合はどうなりますか? getTime()をゼロとして取得し、データを失うリスクがあります。 –

+1

@RameshKC:私はあなたの要求に答えました。あなたの要件が理にかなっていない場合は、その質問に答える必要があります。 1970-01-01T00:00Zを明示的に拒否したかったのですが、両方の方法を取ることはできません。私はgnomedの懸念に同意します、btw。 –

2

であることを起こる正当入力を受け付けないようにします。

TL; DR

input.equals(Instant.EPOCH) 

java.time

あなたは今java.timeクラスに取って代わられている厄介な古い日時のクラスを使用しています。

クラスは、タイムライン上でUTCの瞬間としてDateの代わりに使用されますが、ミリ秒ではなくナノ秒の分解能が細かくなります。

まだ更新されていない従来のコードとのインタフェース時には、java.timeクラスに変換することができます。変換するには、古いクラスに追加された新しいメソッドを呼び出します。

Instant instant = myDate.toInstant() ; 

nullを確認してください。

if (null == input) { 
    throw new IllegalArgumentException("Received invalid input: null.") ; 
} 

特別な懸案事項であると思われるカウント・カウント・エポック値ゼロを確認してください。 Instantクラスは、UnixとJavaで使用されるエポック参照日時からのゼロ秒のカウントに対して、その定数があります。1970年の最初の瞬間はUTCです。

if (input.equals(Instant.EPOCH)) { 
    throw new IllegalArgumentException("Received invalid input: Instant.EPOCH. Input must be later than 1970-01-01T00:00:00Z.") ; 
} 

ビジネスルールの必要に応じて、最近の日時の値を確認したい場合があります。

if (input.isBefore(Instant.now())) { 
    throw new IllegalArgumentException("Received invalid input. Input must not be in the past.") ; 
} 

タイムゾーンを考慮して文字列を生成します。どの瞬間でも、日付と時刻はゾーンごとに世界中で異なります。

ZoneId z = ZoneId.of("America/Montreal") ; 
ZonedDateTime zdt = instant.atZone(z) ; 

希望のフォーマットは、標準のISO 8601フォーマットの「基本」バージョンです。この形式は定数として事前定義されています。DateTimeFormatter.BASIC_ISO_DATE

String output = zdt.format(DateTimeFormatter.BASIC_ISO_DATE) ;