Сравнение строк даты - PullRequest
0 голосов
/ 23 апреля 2019

Я только что обнаружил, что этот код работает нормально (Chrome, Firefox, Node.js):

"2018-06-02" > "2018-05-10"
<- true

"2018-06-02" > "2020-05-10"
<- false

Это действительно предназначено для такой работы? Я не могу найти ничего о сравнении таких форматированных строк в JavaScript, кроме как преобразовать их в отдельные объекты Date и сравнить их впоследствии. Что здесь происходит, строки преобразуются в числа / даты / символы внутри?

Это неправильное утверждение, похоже, также работает в некотором роде:

"2018-06-20" > "2018-05-40"
<- true

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Действительно ли это должно работать следующим образом?

Если строки являются действительными датами, это нормально, но не специально, потому что они являются датами.

Строки сравниваются в лексикографическом (произвольном, алфавитном) порядке слева направо.Поскольку «0» меньше, чем «1», а «1» меньше, чем «2» и т. Д., И поскольку эти строки сначала имеют наиболее значимую часть даты (годы) и наименее значимая часть (дни) последняя, ​​лексикографический порядок также бывает датой.

Если строки были в европейском формате ДД / ММ / ГГГГ или в формате США ММ / ДД / ГГГГ,это не сработает, потому что у них нет самых частей даты в порядке от наиболее значимого до наименее значимого.

Причина "2018-06-20" > "2018-05-40" верна, но сравнивает их как даты, используя разумную интерпретацию того, что этовторой должен означать (дата 2018-06-09), будет ложным то, что они снова сравниваются как строки , символ за символом.Нормализация не производится, никакой логики для конкретной даты вообще.

0 голосов
/ 23 апреля 2019

Вы можете сравнить любой вид строки.

 "a" < "b"

Это называется лексикографическое сравнение .Он будет идти слева направо, символ за символом и будет сравнивать позицию в алфавите, если символ отличается.Для цифр с одинаковой длиной, которые будут работать, как и ожидалось, то же самое будет работать и со строками даты ISO.

Некоторые примеры, где это не работает:

 "19" > "2" // false, "2" is bigger "1"
 "12:35 23.4.2019" < "12:34 25.4.2019" // false, "4" is smaller "5"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...