powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сравнение дат на Си
25 сообщений из 32, страница 1 из 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
25 сообщений из 32, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сравнение дат на Си
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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