У нас есть записи в нашем хранилище данных, которые имеют эффективный и срок действия. Эта информация хранится с использованием строкового представления Instant
.
Есть записи, которые никогда не истекают. Но поскольку значение даты истечения срока действия является обязательным, мы решили сохранить строковое представление Instant.MAX
.
Пока все хорошо. Мы используем прецедент для поиска всех записей, которые активны во временном диапазоне ввода [s,e]
. Мы запрашиваем хранилище данных и возвращаем все такие записи [Si, Ei]
, которые удовлетворяют условию Si < s && e < Ei
Обратите внимание, что здесь сравниваются представления строк.
Теперь проблема заключается в том, что +
добавляется к строковому представлению Instant.MAX
. Это не соответствует условию e < Ei
, так как ASCII('+') < ASCII(digit)
.
Я написал фрагмент кода, который нужно знать, после чего 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
У меня есть возможность обрезать +
перед сохранением в хранилище данных. Меня больше интересует, почему это происходит и как мы можем избежать этого?