2012-05-15 70 views
7

因此,我使用的是dateString1.compareTo(dateString2),它基於每個字符的Unicode值對字符串進行字典式比較,並返回一個int值。這是一個代碼示例。在Java中比較日期字符串

String dateString1 = "05-12-2012"; 
String dateString2 = "05-13-2012"; 
if (dateString1.compareTo(dateString2) <=0){ 
    System.out.println("dateString1 is an earlier date than dateString2"); 
} 

這是一個錯誤的方法來比較Java中的日期?

在我的測試中,我沒有遇到過我得到意想不到的結果的情況。如果我不需要,我真的不想在字符串中創建一個Date對象,因爲我在長時間運行的循環中執行此操作。

忍者編輯 從答案拾荒下面有什麼不對比較日期爲一個字符串,如果它是在yyyyMMdd格式,但如果是在任何其他格式會明顯導致錯誤。

我實際上在我的實際代碼中實際上有我的日期字符串爲yyyyMMdd格式。 (我在上面給出的示例中輸入了錯誤的格式。)因此,現在我只是保留原來的代碼,並添加幾行註釋來證明我的決定。

但我現在看到,比較這樣的字符串是非常有限的,如果dba決定將日期格式更改爲道路,我將不會看到發生的情況。

+2

看看這個問題由我問前段時間http://stackoverflow.com/questions/2592501/compare-dates-in-java – ant

回答

8

我建議你做正確的事(as described here)並轉換爲適當的Date對象進行比較。擔心如果實際影響您的應用程序時性能會受到影響(它可能不會)。

+2

除了在2017年(和之後),改爲「LocalDate」,而不是(「Date」在2012年是不錯的選擇,現在已經過時了)。 –

4

這是非常糟糕的,因爲現在你不能處理一年的變化。

如果你想這樣做,你可能想格式化日期爲YYYY-MM-DD,所以新的一年不會毀了它。

+1

任何建議比較日期爲字符串的方法值得一對夫婦友好的拳擊! :) – Alfabravo

+3

YYYYMMDD可以比較爲字符串。 –

17

使用字符串來處理Java中的日期並不總是最好的選擇。例如,當它是跳躍年,2月有一個額外的一天。由於字符串可能看似正確,因此執行轉換更合適。 Java驗證日期是否正確。

可以使用SimpleDateFormat類將字符串轉換爲日期。

public static void main(String[] args) throws ParseException { 
    String dateString1 = "05-12-2012"; 
    String dateString2 = "05-13-2012"; 

    SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy"); 

    Date date1 = format.parse(dateString1); 
    Date date2 = format.parse(dateString2); 

    if (date1.compareTo(date2) <= 0) { 
     System.out.println("dateString1 is an earlier date than dateString2"); 
    } 
} 

要了解哪些參數允許檢查Customizing Formats (The Java™ Tutorials > Internationalization > Formatting)

+0

你試過這段代碼嗎? –

+0

是的,打印'dateString1是比dateString2'更早的日期。代碼有問題嗎? –

+0

日期字符串的格式不同於SimpleDateFormat構造函數。 –

1

如果你正在做各只有一個日期,然後YYYYMMDD(不MMDDYYYY因爲你做到了)的讀取可能是最優化的解決方案。然而,當你打算每次處理多個日期(例如,你正在對它們進行排序)時,最好將它們改爲一個比字符串更快的對象(例如,日期)

2

這是不好用的規則,字母化處理的日期順序,主要是因爲你碰到那裏的東西是有序的不同根據字母和數字系統

字母表

01-02-2011 comes before 
01-1-2011 (because 0 in the date field is before 1 in the other date field) 
問題

對於數字系統

01, 02, 2011 comes after 
01, 1, 2011 because all fields are being compared like numbers 

日期對象擴展數字比較知道哪些字段優先在試比較n,所以你不會在前一個月的某個日期之前「在」另一個實際發生在另一個月但是較早的一個月。

如果你對日期格式有嚴格的控制,你可以對齊日期,使它們也遵循字母規則;但是,如果您不小心插入了格式不正確的日期,那麼這樣做可能會導致整個程序以奇怪的方式失敗。

做到這一點的典型方式(不推薦,請使用非字符串日期比較)

YYYYMMDD 
(year)(month)(day) all zero-padded. 

最後的技術被列入主要是因爲你最終會看到它在野外的,應該承認它它是什麼:嘗試處理日期沒有適當的日期庫(又名聰明的黑客)。

+0

謝謝。你能給最後一部分提供參考嗎?這種情況對我很有幫助,但我只想確保邏輯充分證明 – ShikharDua

1

如前所述,通常更適合使用日期 - 時間對象而不是字符串。

java.time

其他答案使用已被證明是設計不當,令人費解,麻煩老過時的日期時間類。他們缺乏一門課來真正代表沒有時間和沒有時區的日期價值。

改爲使用內置於Java 8及更高版本中的java.time框架。見Oracle Tutorial。許多java.time功能被移植到ThreeTen-Backport中的Java中,並進一步適用於Android的ThreeTenABP

String input = "05-12-2012"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate ld = LocalDate.parse(input , formatter); 

LocalDate實現compareTo。此外,您可以調用方法equals,isBefore,isAfter。

Boolean isEarlier = ld.isBefore(someOtherLocalDate);