2012-03-06 3 views
9

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

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

Спасибо!

ответ

20

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

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

Из ISO 8601 wikipedia page:

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

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

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

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

2010-03-01 
2010-W01-1 

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

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

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

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

+0

Это формат даты: 2012-03-05 00: 30: 00.000 – alphablender

+0

@alphablender, это не дата, это дата/время :-) Но теория по-прежнему сохраняется: преобразуйте ее в общую форму, чтобы лексикографическая сортировка работала, сортировала ее, а затем переводила обратно (при необходимости). Если _all_ ваших дат уже имеет такую ​​форму, вам совсем не нужно конвертировать - обычная сортировка строк будет работать нормально. – paxdiablo

8

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

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

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

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

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

+2

Ницца по дизайну, но все же гораздо медленнее, чем сортировка в эпоху unix millis или sec, если у вас много дат. –

+0

Timezones также будут закручивать заказ, не так ли? – whiskeysierra

+0

@whiskeysierra Хорошая точка. – rjmunro

Смежные вопросы