我们在我们的数据存储中有有效的&到期时间的记录。该信息使用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