code_prettify

2014年11月15日 星期六

Compare java.sql.Date

以下的 Date專指 java.sql.Date.

在思考 Date比較時, 如果要用到 after or before, 最好不要用 a.after(b) or a.before(b)的思考邏輯,而是用 !b.before(a) or !b.after(a)的邏輯思考,在企業環境中比較不容易出錯.
Date的 after or before 怎麼比呢?
基本上等同於 a.getTime() > or a.getTime() <.其中沒有等於的空間,也就是沒有 >= or <=.
所以 a.after(b)等同於 a.getTime() > b.getTime(). a.before(b)等同於 a.getTime() < b.getTime().
這並不惱人, 邏輯其實很清楚.
但重點來了: 商用環境中,當你從 DB 拿到一個 Date時,你並不知道這個 Date到底當初是用
Date.valueOf(String)還是 new Date(System.currentTimeMillis())來的(也許有些規劃得很好的系統沒這問題,但是維護前人留下來的系統時,沒那工夫去檢查到底有沒有不一致的做法(甚至有時是不得已: 尤其有些日期是直接由 UI輸入,有些 Date是 current date, 而這兩種 Date須互相比較時.)
以 2014-05-02為例:
Date.valueOf("2014-05-02").getTime() == 1398960000000.
new Date(1399025789901(L)).toString == 2014-05-02.(事實上是2014-05-02 18:16:29.901)
從 DB看, 兩個都是 2014-05-02.
但是 equals絕對 return false.
因此純粹日期比較時要嘛先過一次水讓兩個日期的邏輯一致, 要嘛, 就是用 not after, not before去思考.

沒有留言: