powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сравнение дат на Си
32 сообщений из 32, показаны все 2 страниц
Сравнение дат на Си
    #33583861
mxlPostgres
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как осуществить сравнение дат на языке Си.Даты имеют формат YYYY-MM-DD hh:mm:ss.Нужно в конструкции if (data1<data2) { ... }. Почему-то не работает в таком виде.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33583881
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mxlPostgresКак осуществить сравнение дат на языке Си.Даты имеют формат YYYY-MM-DD hh:mm:ss.Нужно в конструкции if (data1<data2) { ... }. Почему-то не работает в таком виде.Тип то какой?
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33584119
mxlPostgres
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Данные читаются из текствого файла.В файле они в виде Fri Dec 30 00:00:00 NOVT 2005.Данные приводятся к формату 2006-Dec-30 00:00:00.Тип char,но можно и др тип сделать,в чем собственно и вопрос.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33584202
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mxlPostgresДанные читаются из текствого файла.В файле они в виде Fri Dec 30 00:00:00 NOVT 2005.Данные приводятся к формату 2006-Dec-30 00:00:00.Тип char,но можно и др тип сделать,в чем собственно и вопрос.

Для простоты сравнения и скорости приводить нужно к типу unsigend long или time_t .

см. time_t mktime(struct tm *tm);
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33584207
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Библиотечных ф-ций для перевода даты из такого формата в какой-нибудь стандартный (time_t, CTime (MFC)), по крайней мере в VC, нет. Так-что здесь наверное ручками поработать нужно :).
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33584317
homichus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mxlPostgresКак осуществить сравнение дат на языке Си.Даты имеют формат YYYY-MM-DD hh:mm:ss.Нужно в конструкции if (data1<data2) { ... }. Почему-то не работает в таком виде.

если работать со строковыми типами, которые поддерживают сравнение строк(например AnsiString в bcb), то можно работать и с форматом
YYYY-MM-DD hh:mm:ss

сравнение будет работать.

а также везде есть некие типы, специально, предназначенные для работы с временем и датой, в bcb это TDateTime, там операторы сравнения переопределены.

но это все для Си++, т.е. не для чистого Си.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33584468
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_БалтикаБиблиотечных ф-ций для перевода даты из такого формата в какой-нибудь стандартный (time_t, CTime (MFC)), по крайней мере в VC, нет. Так-что здесь наверное ручками поработать нужно :).

Понятное дело придется поработать.

Как по мне, так проще распарсить строку
заполинть

[SRC time.h(GCC)]
struct tm {
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
int tm_wday; /* day of the week */
int tm_yday; /* day in the year */
int tm_isdst; /* daylight saving time */
};
[/src]
скормить структуру функции mktime и сравнивать числа,
чем писать свой алгоритм сравнения.

В VC, я думаю, найдется похожий инструмент.

зы Я подозреваю автор скоро задаст вопрос как получить
разницу между строковыми датами.
Ответ: точно также, только нужно не сравнивать а отнимать.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33584807
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_БалтикаБиблиотечных ф-ций для перевода даты из такого формата в какой-нибудь стандартный (time_t, CTime (MFC)), по крайней мере в VC, нет. Так-что здесь наверное ручками поработать нужно :).обычно sscanf+mktime хватает :)
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33616930
mxlPostgres
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приведите пример с использованием sscanf и mktime.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33616999
mxlPostgres
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В каком формате вводится год в tm_year. Не воспринимает числа типа 1990 итд.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33617216
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mxlPostgresВ каком формате вводится год в tm_year. Не воспринимает числа типа 1990 итд.
Вычти из 1990 1970 - в libc все даты от 0 часов 1 января 1970 года.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33617218
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mxlPostgresВ каком формате вводится год в tm_year. Не воспринимает числа типа 1990 итд.
Не знаю, поможет это тебе или нет, но вот пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
...
 typedef struct {
 ....
  BYTE rdi_orc[ 4 ];
 } bill;

  bill myBill;
  time_t long_time,tmp_time;
  struct tm *newtime;
 char *trans=new char[ 1024 ];

...
 long_time=(((((myBill.rdi_orc[ 1 ]<< 8 )+(myBill.rdi_orc[ 0 ]))<< 8 )+myBill.rdi_orc[ 3 ])<< 8 )+(myBill.rdi_orc[ 2 ]);
 newtime=localtime(&long_time);
 if (newtime)
 {
  sprintf(trans,"\t%.2d.%.2d.%.4d %.2d:%.2d:%.2d\t",newtime->tm_mday,++(newtime->tm_mon),( 1900 +newtime->tm_year),newtime->tm_hour,newtime->tm_min,newtime->tm_sec);
...
}

Обратите внимание на:
++(newtime->tm_mon)
и на:
(1900+newtime->tm_year)
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33617251
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Ильич mxlPostgresВ каком формате вводится год в tm_year. Не воспринимает числа типа 1990 итд.
Вычти из 1990 1970 - в libc все даты от 0 часов 1 января 1970 года.
не совсем так:
MSDN Help
tm structure, defined in TIME.H.
...
timeptr Field Value
tm_hour Hours since midnight (0 – 23)
tm_mday Day of month (1 – 31)
tm_min Minutes after hour (0 – 59)
tm_mon Month (0 – 11; January = 0)
tm_sec Seconds after minute (0 – 59)
tm_wday Day of week (0 – 6; Sunday = 0)
tm_yday Day of year (0 – 365; January 1 = 0)
tm_year Year (current year minus 1900)
tm_isdst Positive if daylight saving time is in effect; 0 if daylight saving time is not
in effect; negative if status of daylight saving time is unknown. The C run-
time library assumes the United States’s rules for implementing the
calculation of Daylight Saving Time (DST).
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33617264
mxlPostgres
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как в Си можно разобрать время в формате hh:mm:ss на отдельные составляющие: часы,минуты,секунды?
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33617286
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mxlPostgresКак в Си можно разобрать время в формате hh:mm:ss на отдельные составляющие: часы,минуты,секунды?
Очень просто:
Help по функции strtok(); + в качестве разделителя указать символ ':'
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33618695
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
strtok()-говно. Строки надо разбивать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
template<typename _OutIter>
void split(const std::wstring& str, _OutIter _outIter, const std::wstring& delim=L",")
{
	std::wstring::size_type lpos =  0 ;
	std::wstring::size_type pos = str.find_first_of(delim, lpos);
    while (lpos != std::wstring::npos) {
        *_outIter++ = str.substr(lpos,pos - lpos);
        lpos = ( pos == std::wstring::npos ) ? std::wstring::npos : pos +  1 ;
        pos = str.find_first_of(delim, lpos);
    }
}

std::wstring str(L"1:2:3");
std::vector<std::wstring> out;
split(str, std::back_inserter(out), L":");

...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33618747
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
std::wstring-говно. Строки надо разбивать так:
Код: plaintext
1.
2.
3.
4.
5.
	char *buf = "1:14:13";
	int h, m, s;

	sscanf(buf, "%d:%d:%d", &h, &m, &s);
	printf("h=%d\nm=%d\ns=%d", h, m, s);
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33619992
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я прав, а White Owl не прав. Следовательно, надо делать, как я написал.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33620125
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ИльичЯ прав, а White Owl не прав. Следовательно, надо делать, как я написал.


1. Вопрос звучит "Сравнение дат на Си "
СИ есть подмножеством С++.И sscanf попадает в это подмножество.

2. Вариант White Owl проще и надежнее и понятнее.

Поэтому вариант White Owl более правелен чем ваш.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33622929
Agent 007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mxlPostgresКак осуществить сравнение дат на языке Си.Даты имеют формат YYYY-MM-DD hh:mm:ss.Нужно в конструкции if (data1<data2) { ... }. Почему-то не работает в таком виде.

Ето так просто, что не понимаю как можно спрашивать. Читаеш даты в стринги:

char date1[20], date2[20];

.... // читать значения date1 и date2

if ( strcmp( date1, date2 ) < 0 ) { ...};
if ( strcmp( date1, date2 ) > 0 ) { ...};
if ( strcmp( date1, date2 ) == 0 ) { ...};
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33622982
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Agent 007 mxlPostgresКак осуществить сравнение дат на языке Си.Даты имеют формат YYYY-MM-DD hh:mm:ss.Нужно в конструкции if (data1<data2) { ... }. Почему-то не работает в таком виде.

Ето так просто, что не понимаю как можно спрашивать. Читаеш даты в стринги:

char date1[20], date2[20];

.... // читать значения date1 и date2

if ( strcmp( date1, date2 ) < 0 ) { ...};
if ( strcmp( date1, date2 ) > 0 ) { ...};
if ( strcmp( date1, date2 ) == 0 ) { ...};
А часовые пояса ты куда здесь засунешь, [censored] ?
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33623031
Agent 007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Ильич Agent 007 mxlPostgresКак осуществить сравнение дат на языке Си.Даты имеют формат YYYY-MM-DD hh:mm:ss.Нужно в конструкции if (data1<data2) { ... }. Почему-то не работает в таком виде.

Ето так просто, что не понимаю как можно спрашивать. Читаеш даты в стринги:

char date1[20], date2[20];

.... // читать значения date1 и date2

if ( strcmp( date1, date2 ) < 0 ) { ...};
if ( strcmp( date1, date2 ) > 0 ) { ...};
if ( strcmp( date1, date2 ) == 0 ) { ...};
А часовые пояса ты куда здесь засунешь, [censored] ?

Если работаеш с GMT (UTC) нет часовые поясы. Все времевые данны сохраняются и сравняются в GMT, а только при изображение делается конверсия к локальное время. Думаю что ето правильный подход. Как думаеш, Сергей?
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33623128
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Agent 007
Если работаеш с GMT (UTC) нет часовые поясы. Все времевые данны сохраняются и сравняются в GMT, а только при изображение делается конверсия к локальное время. Думаю что ето правильный подход. Как думаеш, Сергей?
А почему бы time_t не сравнивать? Что быстрее-сравнение двух int-ов или двух строк?
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33623241
Agent 007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Ильич Agent 007
Если работаеш с GMT (UTC) нет часовые поясы. Все времевые данны сохраняются и сравняются в GMT, а только при изображение делается конверсия к локальное время. Думаю что ето правильный подход. Как думаеш, Сергей?
А почему бы time_t не сравнивать? Что быстрее-сравнение двух int-ов или двух строк?

Правда, что сравнение двух time_t быстрее, но дефиниция time_t:

typedef long time_t;

В 32 бит времевая информация неполная. Год только 7 бит, секунды через 2. Ето старая кодировка date:time из время ДОС-а.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33623981
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Agent 007 Сергей Ильич Agent 007Как думаеш, Сергей?
А почему бы time_t не сравнивать? Что быстрее-сравнение двух int-ов или двух строк?

Правда, что сравнение двух time_t быстрее, но дефиниция time_t:

typedef long time_t;

В 32 бит времевая информация неполная. Год только 7 бит, секунды через 2. Ето старая кодировка date:time из время ДОС-а.
Пустой разговор: В Cи все равно никакого времени кроме как 32-битного нет. MFC класс CTime - это обертка вокруг time_t. А чтобы получить время в виде строчки, надо сначала получить его как time_t, и потеря дискретности будет тут. Лично я использую FILETIME в своих программах.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33624311
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Agent 007
В 32 бит времевая информация неполная. Год только 7 бит, секунды через 2. Ето старая кодировка date:time из время ДОС-а.

Где вы это вычитали? Дайте первоисточник pls.

Мне не извесны 32 разрядные операционные системы,
считающие время через секунду.

Переполнение 32 разрядного time_t наступит :
Считаем приблизительно
2^31 / 60*60*24*365 +1970 ~ = 2038 год.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33624377
Agent 007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
onstat- Agent 007
В 32 бит времевая информация неполная. Год только 7 бит, секунды через 2. Ето старая кодировка date:time из время ДОС-а.

Где вы это вычитали? Дайте первоисточник pls.

Мне не извесны 32 разрядные операционные системы,
считающие время через секунду.

Переполнение 32 разрядного time_t наступит :
Считаем приблизительно
2^31 / 60*60*24*365 +1970 ~ = 2038 год.

Ок, виноват я. Думал о кодировке дата:час в 32 бит как у файлы в FAT, а в етом случае time_t секунды от 1970... Но - смотря на оригинального сообщения mxlPostgres, я думаю что ему сравнение нужно в связи с БД. Конверсия БД->time_t + сравнение 2 int будет медленно, чем БД->стринг_в_формате_YYYY-MM-DD... + сравнение 2 стрингов.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33625296
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Agent 007 onstat- Agent 007
В 32 бит времевая информация неполная. Год только 7 бит, секунды через 2. Ето старая кодировка date:time из время ДОС-а.

Где вы это вычитали? Дайте первоисточник pls.

Мне не извесны 32 разрядные операционные системы,
считающие время через секунду.

Переполнение 32 разрядного time_t наступит :
Считаем приблизительно
2^31 / 60*60*24*365 +1970 ~ = 2038 год.

Ок, виноват я. Думал о кодировке дата:час в 32 бит как у файлы в FAT, а в етом случае time_t секунды от 1970... Но - смотря на оригинального сообщения mxlPostgres, я думаю что ему сравнение нужно в связи с БД. Конверсия БД->time_t + сравнение 2 int будет медленно, чем БД->стринг_в_формате_YYYY-MM-DD... + сравнение 2 стрингов.

в БД есть функции сравнения дат.
Если бы автора интресовал вопрос относительно бд
он бы обратился в раздел соответствующий его базе.

Если говорить о сравнении строковых дат и чиловых, то
давайте померяем.

Мне лень писать строковый сравнитель а вот
числовой пожалуйста.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
/**********************************************************************
*  Time comparation  example  for   SQL.RU 
*
************************************************************************/

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <string.h>

struct tm tm_1;  // first time parameter
struct tm tm_2;  // second time parameter
struct timeval s_time; // start time
struct timeval e_time; // end time
time_t l_time1= 0 ;        // first time in a  digit format
time_t l_time2= 0 ;        // second time in a digit format

char cres[ 16 ] ="less then\0";  //character result

int res; // any results

/********************************************************************
*********************************************************************/

int main(int argc, char* argv[])
{

if(argc <  3  )
{
printf ("Invalid number of parameters\n");
return - 1 ;
};

bzero(&tm_1, sizeof(tm));
bzero(&tm_2, sizeof(tm));
bzero(&s_time, sizeof(timeval));
bzero(&e_time, sizeof(timeval));


gettimeofday(&s_time, NULL);  // save start time point

//parsing first parameter
res=sscanf(argv[ 1 ], "%4d-%2d-%2d:%2d:%2d:%2d", 
&tm_1.tm_year, &tm_1.tm_sec,  &tm_1.tm_mon,  &tm_1.tm_mday, &tm_1.tm_hour, &tm_1.tm_min, &tm_1.tm_sec );
if (res !=  6 ) 
{
printf("Invalid format on %s\n Must be a YYYY-MM-DD:HH24:MI:SS \n", argv[ 1 ]);
return - 1 ;
};
tm_1.tm_year=tm_1.tm_year- 1900 ;



//parsing second parameter
res=sscanf(argv[ 2 ], "%4d-%2d-%2d:%2d:%2d:%2d", &tm_2.tm_year, &tm_2.tm_sec,  &tm_2.tm_mon,  &tm_2.tm_mday, &tm_2.tm_hour, &tm_2.tm_min, &tm_2.tm_sec );
if (res !=  6 ) 
{
printf("Invalid format on %s\n Must be a YYYY-MM-DD:HH24:MI:SS \n", argv[ 2 ]);
return - 1 ;
};
tm_2.tm_year=tm_2.tm_year- 1900 ;

l_time1=mktime(&tm_1);
l_time2=mktime(&tm_2);


if(l_time1 > l_time2) sprintf(&cres[ 0 ],  "more then\0");
if(l_time1 == l_time2) sprintf(&cres[ 0 ], "equal to\0");

gettimeofday(&e_time, NULL); // save end time point

printf( "%s %s %s\n", argv[ 1 ], &cres[ 0 ], argv[ 2 ] );
printf ("comparaion takes 0.%.6d second\n", e_time.tv_usec - s_time.tv_usec);

return  0 ;
};

Если вызовы gettimeofday подвигать по коду видно что
основную массу времени действительно съедает mktime

У меня все сравнение занимает от 250- 450 микросекунд.
Если кто напишет строковый сравнитель можно будет проверить.

Программа легко дополняется операциями со временем.

Код писался под Linux.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33625391
Agent 007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
onstat- Agent 007 onstat- Agent 007
В 32 бит времевая информация неполная. Год только 7 бит, секунды через 2. Ето старая кодировка date:time из время ДОС-а.

Где вы это вычитали? Дайте первоисточник pls.

Мне не извесны 32 разрядные операционные системы,
считающие время через секунду.

Переполнение 32 разрядного time_t наступит :
Считаем приблизительно
2^31 / 60*60*24*365 +1970 ~ = 2038 год.

Ок, виноват я. Думал о кодировке дата:час в 32 бит как у файлы в FAT, а в етом случае time_t секунды от 1970... Но - смотря на оригинального сообщения mxlPostgres, я думаю что ему сравнение нужно в связи с БД. Конверсия БД->time_t + сравнение 2 int будет медленно, чем БД->стринг_в_формате_YYYY-MM-DD... + сравнение 2 стрингов.

в БД есть функции сравнения дат.
Если бы автора интресовал вопрос относительно бд
он бы обратился в раздел соответствующий его базе.

Если говорить о сравнении строковых дат и чиловых, то
давайте померяем.

Мне лень писать строковый сравнитель а вот
числовой пожалуйста.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
/**********************************************************************
*  Time comparation  example  for   SQL.RU 
*
************************************************************************/

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <string.h>

struct tm tm_1;  // first time parameter
struct tm tm_2;  // second time parameter
struct timeval s_time; // start time
struct timeval e_time; // end time
time_t l_time1= 0 ;        // first time in a  digit format
time_t l_time2= 0 ;        // second time in a digit format

char cres[ 16 ] ="less then\0";  //character result

int res; // any results

/********************************************************************
*********************************************************************/

int main(int argc, char* argv[])
{

if(argc <  3  )
{
printf ("Invalid number of parameters\n");
return - 1 ;
};

bzero(&tm_1, sizeof(tm));
bzero(&tm_2, sizeof(tm));
bzero(&s_time, sizeof(timeval));
bzero(&e_time, sizeof(timeval));


gettimeofday(&s_time, NULL);  // save start time point

//parsing first parameter
res=sscanf(argv[ 1 ], "%4d-%2d-%2d:%2d:%2d:%2d", 
&tm_1.tm_year, &tm_1.tm_sec,  &tm_1.tm_mon,  &tm_1.tm_mday, &tm_1.tm_hour, &tm_1.tm_min, &tm_1.tm_sec );
if (res !=  6 ) 
{
printf("Invalid format on %s\n Must be a YYYY-MM-DD:HH24:MI:SS \n", argv[ 1 ]);
return - 1 ;
};
tm_1.tm_year=tm_1.tm_year- 1900 ;



//parsing second parameter
res=sscanf(argv[ 2 ], "%4d-%2d-%2d:%2d:%2d:%2d", &tm_2.tm_year, &tm_2.tm_sec,  &tm_2.tm_mon,  &tm_2.tm_mday, &tm_2.tm_hour, &tm_2.tm_min, &tm_2.tm_sec );
if (res !=  6 ) 
{
printf("Invalid format on %s\n Must be a YYYY-MM-DD:HH24:MI:SS \n", argv[ 2 ]);
return - 1 ;
};
tm_2.tm_year=tm_2.tm_year- 1900 ;

l_time1=mktime(&tm_1);
l_time2=mktime(&tm_2);


if(l_time1 > l_time2) sprintf(&cres[ 0 ],  "more then\0");
if(l_time1 == l_time2) sprintf(&cres[ 0 ], "equal to\0");

gettimeofday(&e_time, NULL); // save end time point

printf( "%s %s %s\n", argv[ 1 ], &cres[ 0 ], argv[ 2 ] );
printf ("comparaion takes 0.%.6d second\n", e_time.tv_usec - s_time.tv_usec);

return  0 ;
};

Если вызовы gettimeofday подвигать по коду видно что
основную массу времени действительно съедает mktime

У меня все сравнение занимает от 250- 450 микросекунд.
Если кто напишет строковый сравнитель можно будет проверить.

Программа легко дополняется операциями со временем.

Код писался под Linux.

Я уверен что даже только один из sscanf-ов теряет более времени чем strcmp. Сравнение времени будет точнее если вычислиш 1000 или 10000+ сравнения двух методов, чем ети микросекунды.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33625431
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строки нужны для хранения имен, адресов или других слов. Для хранения дат нужно использовать специализированный целочисленный тип. Точка. Очень любят со строками работать индусы - им вообще другие типы не нужны.
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33625458
Agent 007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей ИльичСтроки нужны для хранения имен, адресов или других слов. Для хранения дат нужно использовать специализированный целочисленный тип. Точка. Очень любят со строками работать индусы - им вообще другие типы не нужны.

Пропустил пояснить, что ето только твое мнение. А индусы не так глупые. Лучше бы сказал албанцы как храняют даты :)
...
Рейтинг: 0 / 0
Сравнение дат на Си
    #33625615
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Agent 007
Я уверен что даже только один из sscanf-ов теряет более времени чем strcmp. Сравнение времени будет точнее если вычислиш 1000 или 10000+ сравнения двух методов, чем ети микросекунды.

Сейчас разговор безпредметный.
Вы напешите код, а потом сравнивать будем.
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сравнение дат на Си
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]