функция сравнения для дат - PullRequest
0 голосов
/ 18 марта 2010

У меня есть структура как:

struct stored
{
    char *dates; // 12/May/2010, 10/Jun/2010 etc..
};
// const
struct stored structs[] = {{"12/May/2010"}, {"12/May/2011"}, 
                           {"21/May/2009"}, {"13/May/2011"}, 
                           {"10/May/2011"}, {"19/May/2011"}};

То, что я хочу сделать, это отсортировать структуру «сохранен» по сохраненным данным.

qsort(structs, 9, sizeof(struct stored*), sortdates); // sortdates function

Я не совсем уверен, что будет хорошим способом сортировки в те дни? Сравните их как с-струны?

Ответы [ 4 ]

1 голос
/ 18 марта 2010

Даты в формате ISO 8601 («ГГГГММДД» или «ГГГГ-ММ-ДД» и т. Д.) Тривиально сравнимы как строки C. Ваш формат - нет - будет ли возможным изменение формата строк даты?

PS: Если вы избавитесь от «-», вы можете даже сохранить дату в виде простого 32-битного целого числа. В зависимости от того, что ваше приложение делает с этими датами, это может быть дополнительным бонусом.

1 голос
/ 18 марта 2010

Я бы конвертировал даты в числа, используя что-то вроде:

year * 10000 + month * 100 + day;

, а затем проведите простое числовое сравнение (и для месяца вам нужно будет сопоставить период с января по 1, с февраля по 2 и т. Д.).

Если вы делаете много сравнений, вы можете кэшировать числовой эквивалент в структуре.

1 голос
/ 18 марта 2010

Если вы конвертируете даты в формат YYYYMMDD (как в 20100314), вы можете сравнить их в виде строки или целого числа (после преобразования).

0 голосов
/ 18 марта 2010

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

...