2017-09-29 26 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. 
} 

我做了什麼東西,如下,但是我不能同時傳遞的無效日期以獲得錯誤的零計數從曆元,如「新的日期(0L)」作爲inputDate參數。

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'是'Date',而不是'String'。 –

+0

我的意思是'新的日期(0L)'或8長度爲0的值,我需要的是無效日期而不是轉換爲'19700101'。 –

+2

對,那是*非常非常*不清楚。爲什麼不直接調用'Date.getTime()'並查看它是否返回0? –

回答

1

這聽起來像你只是想:

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

這將檢測是否inputDate爲空或代表的Unix紀元。

正如雖然評論指出:

  • 拒絕一個值是有點危險 - 這是爲什麼new Date(0)「錯誤」,但new Date(1)「權利」?
  • 這可以防止您接受合法輸入碰巧是Unix紀元
+1

我覺得值得注意的是,這隻有檢查一個日期值的非常可怕的氣味,並且可以通過'new Date(1)'輕鬆繞過。當我從開發者那裏得到這樣的問題時,我通常不得不回頭問「爲什麼你只關心那個價值?」答案几乎總是他們關心的不僅僅是一個價值。 – gnomed

+0

如果某些人的確切時間日期與輸入「1970-01-01T00:00Z」一樣,會發生什麼?我會將'getTime()'作爲零,我冒着丟失數據的風險。 –

+1

@RameshKC:我回答了你的要求。如果你的要求沒有意義,你需要質疑。你想明確拒絕1970-01-01T00:00Z - 你不能雙方都有。順便說一句,我同意gnomed的關注。 –

2

通過雙向飛碟接受的答案是正確的。

TL;博士

input.equals(Instant.EPOCH) 

java.time

您使用的是現在由java.time類取代了麻煩老日期時間類。

Instant類取代Date作爲時間軸上的UTC時刻,但具有納秒更精細的分辨率而非毫秒。

您可以在與尚未更新到java.time類的遺留代碼接口時進行轉換。要轉換,請調用添加到舊類的新方法。

Instant instant = myDate.toInstant() ; 

檢查爲空。

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) ;