簡體   English   中英

以String格式比較日期

[英]compare dates in String format

我得到兩個日期作為字符串值,我想檢查開始時間早於結束時間。 我比較它們,因為它沒有使用SimpleDateFormat將它們轉換為日期,如下所示:

String startTime = "2013-01-02 14:25:56";
String endTime   = "2013-01-02 14:30:56";

if(endTime.compareTo(startTime) > 0){
    System.out.println("End time is greater than start time");
}

是否真的有必要將它們轉換為日期並進行比較? 我會錯過什么嗎? 我做對了嗎?

您將缺少的是驗證日期是否格式正確。

如果日期格式與您每次顯示的格式完全相同 ,那么這將起作用。 如果它可能有所不同,那么解析和比較生成的Date對象將至少增加一些檢查。

例如,如果兩個日期的一個碰巧被格式化為2013.01.02 14:30:56或者甚至包括一個未格式化的日期,如yesterday那么您的代碼會默默地承擔了部分的順序(即最有可能沒有什么實際訂單)並繼續。 應該做的是通知用戶(或日志文件,......)某些期望未得到滿足。

是否真的有必要將它們轉換為日期並進行比較?

如果您不必包含時區並且可以確保您始終具有此格式,則詞匯順序將起作用。

我會錯過什么嗎?

你失去了靈活性

我做對了嗎?

這取決於觀點。 我在專門的搜索引擎中使用類似的東西(僅出於性能原因)。 通常我轉換為日期並比較這些對象。

這不是一個好習慣和代碼味道。

你失去了語義正確和可讀的代碼。 (以及已經說過的可擴展性,時區和其他正確的事情)

你不想比較兩個String ,你想要比較2個Date - 所以只需這樣做,比較兩個Date對象。

如果您創建單元測試並測試比較方法,則永遠不會編寫一個方法,在每種情況下都能正確地比較2個“字符串” - 日期,而不會將它們轉換為日期。

當且僅當滿足以下3個條件時,您可以比較日期時間而不正確解析它:

  1. 日期時間始終采用相同的格式:

    • 相同數量的字段
    • 字段必須是純數字。 (字符串比較: Jan > AprilWed > Thu )。
    • 字段的大小是固定的(如果需要,填充0)。 例如,沒有適當的填充將導致10:01 < 1:01: ASCII碼比數字大)。
    • 非數字部分(包括分隔符)必須與間距相同。
  2. 字段按單位大小的降序排列(右側較大,左側較小)。 例如: YEAR-MONTH-DAY HOUR:MINUTE:SECOND.MILISECOND

  3. 他們必須在同一時區。 時區信息(如果存在)應具有相同的表示( SGTUTC+8當前是等效的,但字符串比較不會知道這一點)。 注意,上述模糊條件“相同時區”足以比較相等,但為了比較大/小,在比較的兩個日期之間必須沒有時區發生變化。

關於什么

  "999-01-01 00:00:00"

"10000-01-01 00:00:00"

我建議首先將它們轉換為日期更安全一點,但只要您確定格式(或時區等)將永遠不會改變您,那么日期比較並比較該格式的字符串應始終相當於。

你的方法很好,因為yyyy-mm-dd hh:ii:ss可以比較為字符串並獲得正確的結果,其他日期格式將失敗

另一種選擇是閱讀這個stackoverflow問題

如何比較Java中的日期?

你只需解析你的字符串並創建日期或日歷對象,取決於你想做什么,下面是我認為有用的東西

http://www.mkyong.com/java/java-how-to-get-current-date-time-date-and-calender/

是的,最好將String轉換為Date並進行比較。

  1. 它確保它們實際上是有效的日期,所以沒有20-20-2012。
  2. 轉換完成后,只剩下一個數字比較。
  3. 在比較不同格式的日期時,它具有很大的靈活性。
  4. 另一種方法是編寫解析每個數字並將其與另一個數字進行比較的代碼,這也是同樣多的工作。

是不是Java,你必須先問這些問題:

  • 你需要比較時間還是幾天?
  • 你需要檢查TimeZone,還是所有用戶都在同一時區(或者你不在乎)

如果你需要比較天數,那么'YYYY-MM-dd'格式的字符串就是完美而有效的:

'2018-01-23' < '2018-03-21' 總是,用任何語言。

有了時間和沒有時區,那么在數據庫中將時間存儲為'YYYY-MM-dd HH:mm:ss'也很好。

使用Timezone,你必須學習你的平台(代碼和數據庫),並了解utc是什么(祝你好運!)。

(在http://xkcd.com/1179/的 CC BY-NC 2.5許可下使用。)

我的日期來自基於字符串的來源,並且始終格式為YYYY-MM-DD,沒有時區信息或其他復雜情況。 因此,在比較一長串日期時,將它們作為字符串進行比較更簡單,更有效,而不是首先將它們轉換為日期對象。

在我的代碼中犯了這個錯誤之前,這從來都不是問題:

boolean past = (dateStart.compareTo(now) == -1);

這給出了一些不正確的結果,因為compareTo不僅返回值為-1,0或1.這是一個簡單的修復:

boolean past = (dateStart.compareTo(now) < 0);

我把這個問題包括在這里,因為這是我在弄清楚我做錯了什么時發現的SO問題之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM