我們在我們的數據存儲中有有效的&到期時間的記錄。該信息使用Instant
的字符串表示形式存儲。Instant toString prepends plus
有些記錄永遠不會過期。但由於過期日期的值是強制性的,我們決定存儲Instant.MAX
的字符串表示形式。
到目前爲止這麼好。我們有搜索用例來返回在輸入時間範圍[s,e]
內有效的所有記錄。我們查詢數據存儲並返回滿足條件的所有這些記錄[Si, Ei]
Si < s && e < Ei
請注意,字符串表示正在這裏進行比較。
現在問題在於+
被預置爲Instant.MAX
的字符串表示形式。自ASCII('+') < ASCII(digit)
以來,這是失敗條件e < Ei
。
我寫了一段代碼就知道之後second
,則+
開始變得前綴:
Long e = Instant.now().getEpochSecond()*1000;
for (int i = 0; i < 5; i++) {
System.out.println(e + "->" + Instant.ofEpochMilli(e));
e *= 10;
}
它打印:
1471925168000->2016-08-23T04:06:08Z
14719251680000->2436-06-07T17:01:20Z
147192516800000->6634-05-07T02:13:20Z
1471925168000000->+48613-06-14T22:13:20Z
14719251680000000->+468404-07-08T06:13:20Z
我已經截斷+
的選項在堅持數據存儲之前。我更感興趣的是爲什麼會發生這種情況,我們如何明確地避免它?
領先的加號是超出了9999年的所有有效的ISO-8601格式恕我直言,這是一個有點可疑的使用有限值(Instant.MAX)實現無限邊界還是要靠字符串比較。基於即時對象比較,您能否僅從數據庫中檢索實例並在您的應用服務器層中查詢?或者你可以在數據庫/商店中存儲經過的秒數(如數字)。 –
謝謝你指出。比較應該在數據庫本身進行,唯一允許的比較是整數和字符串。我已經使用了字符串表示而不是紀元秒,以便在手動查詢數據時它看起來更具可讀性。 – nitish712
這是可悲的是,ISO委員會選擇+作爲前綴年超越9999的ISO格式的一個很好的特性是標準的ASCII/Unicode字符串排序,時間排序相吻合,這是由符號+侵犯。任何一封信都會保留在9999之後。再加上一些調整,將它延長到0000之前的日期看起來也是可能的。 – chi