Сортировать ISO 8601 по датам вперед или назад - PullRequest
12 голосов
/ 06 марта 2012

У меня есть массив дат в формате ISO8601 и мне нужно их отсортировать.У кого-нибудь есть предложения по алгоритму, который бы работал?Я не думаю, что они будут сортироваться как строки, если я не сильно ошибаюсь, поэтому я предполагаю, что они должны быть разбиты на составные части?

Может кто-нибудь опубликовать алгоритм, предпочтительно независимый от языка, но пример на VB или C # будет работать, если он просто использует строки и целые числа и не имеет встроенных в язык функций.

Спасибо!

Ответы [ 2 ]

26 голосов
/ 06 марта 2012

Это зависит от того, смешиваете вы форматы или нет.

В любом определенном формате, например yyyy-mm-dd или yyyy-Www-d, ISO 8601 создан для лексикографической сортировки (кроме отрицательных лет).

Со страницы википедии ISO 8601 :

Значения даты и времени упорядочены от самого значительного до наименее значимого: год, месяц (или неделя), день, час, минута, секунда и доля секунды. Таким образом, лексикографический порядок представления соответствует хронологическому порядку, за исключением представлений даты, включающих отрицательные годы. Это позволяет естественным образом сортировать даты, например, по файловым системам.

Это означает, что сортировка строк должна работать нормально.

Только если вы смешаете форматы, это не будет работать. Если это так, перед сравнением вам нужно будет конвертировать в определенный формат. Под этим я подразумеваю что-то вроде преобразования всех форматов в yyyy-mm-dd перед сравнением, а затем обратно, если необходимо.

Например, если у вас есть входные данные:

2010-03-01
2010-W01-1

вы можете сначала изменить их все на:

2010-03-01:2010-03-01
2010-01-04:2010-W01-1

(префикс реальных данных с определенной формой) затем сортируйте их. После сортировки вы вернетесь назад и удалите все до первого : символа в каждом элементе, что восстановит исходную форму.

Не обязательно самый эффективный способ, но вам нужно будет сделать что-то вроде , если вы хотите сохранить первоначальную форму. Если это не проблема, просто конвертируйте их в конкретную форму один раз и оставьте так.

10 голосов
/ 12 июня 2012

Я не думаю, что они будут сортироваться как строки, если я не сильно ошибаюсь,

Вы сильно ошибаетесь :-).Они будут сортироваться как строки .Это один из главных плюсов ISO 8601 по сравнению с другими форматами даты.

См. Пункт 1: http://en.wikipedia.org/wiki/ISO_8601#General_principles

... Таким образом, лексикографический порядок представления соответствует хронологическомупорядок ...

, пока вы не имеете дело с отрицательными годами, и вы используете тот же часовой пояс и подформат, т.е. вы не смешиваетена основе месяца и недели (спасибо @paxdiablo и @whiskeysierra за их указание)

...