C как сравнить даты
Перейти к содержимому

C как сравнить даты

  • автор:

C как сравнить даты

Подскажите пожалуйста как правильно сравнивать даты.
Использую функцию DateUtils.hpp
В Мемо1 есть набор дат
08.01.2013
09.01.2013
10.01.2013
11.01.2013
12.01.2013
13.01.2013
14.01.2013

В TDateTimePicker ввожу дату (например 10.01.2013).
В Мемо 2 должно вывести все даты которые меньше TDateTimePicker

Код C++ int i; for(i=0;iLines->Count;i=i++) < TDate A=Memo1->Lines->Strings[i]; TDate B=DateTimePicker1->Date; signed char Result = CompareDate(A,B); switch(Result) < case -1: Memo2->Lines->Add(A); break; default: break; > >

Программа просто зависает.

Если делаю через if

Код C++ if (Result=-1) < Memo2->Lines->Add(A); >

C как сравнить даты

>Как правильно сравнивать даты в формате YYYY-MM-DD hh-mm-ss в конструкции if ()
>{}.
Преобразовать в UNIX вемя и сравнивать количество секунд.
man mktime

>>Как правильно сравнивать даты в формате YYYY-MM-DD hh-mm-ss в конструкции if ()
>>{}.
>Преобразовать в UNIX вемя и сравнивать количество секунд.
>man mktime

А в каком виде у тебя эта дата? Если в строке, то я думаю strcmp() будет их сравнивать вполне корерктно.

>>>Как правильно сравнивать даты в формате YYYY-MM-DD hh-mm-ss в конструкции if ()
>>>{}.
>>Преобразовать в UNIX вемя и сравнивать количество секунд.
>>man mktime
>
>А в каком виде у тебя эта дата? Если в строке, то
>я думаю strcmp() будет их сравнивать вполне корерктно.

В char.

>>>>Как правильно сравнивать даты в формате YYYY-MM-DD hh-mm-ss в конструкции if ()
>>>>{}.
>>>Преобразовать в UNIX вемя и сравнивать количество секунд.
>>>man mktime
>>
>>А в каком виде у тебя эта дата? Если в строке, то
>>я думаю strcmp() будет их сравнивать вполне корерктно.
>
>
>В char.

Ты конечно же имеешь ввиду char* ? 😉

Гут. Просто сравнить 2 строки, думаю, будет быстрее, чем парсить их для конвертания в unixtimestamp. А, учитывая формат даты (именно YYYY-MM-DD hh-mm-ss), это будет вполне корректным сравнением дат.

>>>>Как правильно сравнивать даты в формате YYYY-MM-DD hh-mm-ss в конструкции if ()
>>>>{}.
>>>Преобразовать в UNIX вемя и сравнивать количество секунд.
>>>man mktime
>>
>>А в каком виде у тебя эта дата? Если в строке, то
>>я думаю strcmp() будет их сравнивать вполне корерктно.
>
>
>В char.

Что-то новенькое. Может быть char[] (char*)?!

>>>>>Как правильно сравнивать даты в формате YYYY-MM-DD hh-mm-ss в конструкции if ()
>>>>>{}.
>>>>Преобразовать в UNIX вемя и сравнивать количество секунд.
>>>>man mktime
>>>
>>>А в каком виде у тебя эта дата? Если в строке, то
>>>я думаю strcmp() будет их сравнивать вполне корерктно.
>>
>>
>>В char.
>
>Что-то новенькое. Может быть char[] (char*)?!

Наскока я помню (чесно говоря, на С давно уже не писал), char[] есть ничто иное как указатель на char, т.е. char*. Или я не прав?!

>>Что-то новенькое. Может быть char[] (char*)?!
>
>Наскока я помню (чесно говоря, на С давно уже не писал), char[]
>есть ничто иное как указатель на char, т.е. char*. Или я
>не прав?!

Домашнее задание:

#include
int main(int argc, char *argv[]) {
char s[80] = «Hello»;
strcat(s, «, World!»);
}

#include
int main(int argc, char *argv[]) {
char *s = «Hello «;
strcat(s, «, World!»);
}

Найти 10-ть отличий и понять, почему первое работает, а второе — нет.

>>>Что-то новенькое. Может быть char[] (char*)?!
>>
>>Наскока я помню (чесно говоря, на С давно уже не писал), char[]
>>есть ничто иное как указатель на char, т.е. char*. Или я
>>не прав?!
>
>Домашнее задание:
>
>#include
>int main(int argc, char *argv[]) {
> char s[80] = «Hello»;
>
> strcat(s, «, World!»);
>}
>
>#include
>int main(int argc, char *argv[]) {
> char *s ;
> strcat(s, «, World!»);
>}
>
>Найти 10-ть отличий и понять, почему первое работает, а второе — нет.
>

Нашел место поумничать?!

char s[80] char* = new char(80);

За исключением того что память выделяется в разных местах, но это не имеет отношения к исходному вопросу.

>>>>Что-то новенькое. Может быть char[] (char*)?!
>>>
>>>Наскока я помню (чесно говоря, на С давно уже не писал), char[]
>>>есть ничто иное как указатель на char, т.е. char*. Или я
>>>не прав?!
>>
>>Домашнее задание:
>>
>>#include
>>int main(int argc, char *argv[]) {
>> char s[80] = «Hello»;
>>
>> strcat(s, «, World!»);
>>}
>>
>>#include
>>int main(int argc, char *argv[]) {
>> char *s ;
>> strcat(s, «, World!»);
>>}
>>
>>Найти 10-ть отличий и понять, почему первое работает, а второе — нет.
>>
>
>Нашел место поумничать?!

Это Вы, Пан, умничаете. Посмотрите первую, строчку, которая до сих пор идет в квотировании. А теперь turnon(&brain);

>char s[80] char* = new char(80);

>>>Наскока я помню (чесно говоря, на С давно уже не писал)

Хреновые у Вас познания в Си. new таки пережитки плюсавого.

>За исключением того что память выделяется в разных местах, но это не
>имеет отношения к исходному вопросу.

Опять таки пернули в лужу. В первом сключае char[] она размещается в стеке, а в другом в куче. А в целом, конечно, можно продолжать мести пургу. только в одиночку.

>>>>>Что-то новенькое. Может быть char[] (char*)?!
>>>>
>>>>Наскока я помню (чесно говоря, на С давно уже не писал), char[]
>>>>есть ничто иное как указатель на char, т.е. char*. Или я
>>>>не прав?!
>>>
>>>Домашнее задание:
>>>
>>>#include
>>>int main(int argc, char *argv[]) {
>>> char s[80] = «Hello»;
>>>
>>> strcat(s, «, World!»);
>>>}
>>>
>>>#include
>>>int main(int argc, char *argv[]) {
>>> char *s ;
>>> strcat(s, «, World!»);
>>>}
>>>
>>>Найти 10-ть отличий и понять, почему первое работает, а второе — нет.
>>>
>>
>>Нашел место поумничать?!
>
>Это Вы, Пан, умничаете. Посмотрите первую, строчку, которая до сих пор идет
>в квотировании. А теперь turnon(&brain);
>
>>char s[80] char* = new char(80);
>
>>>>Наскока я помню (чесно говоря, на С давно уже не писал)
>
>Хреновые у Вас познания в Си. new таки пережитки плюсавого.

Вот тут я соглашусь. В чистом Си не силен.

>>За исключением того что память выделяется в разных местах, но это не
>>имеет отношения к исходному вопросу.
>
>Опять таки пернули в лужу. В первом сключае char[] она размещается в
>стеке, а в другом в куче. А в целом, конечно, можно
>продолжать мести пургу. только в одиночку.

А разве стек и куча — не разные места?! Я про это и говорил.

>>>>>Что-то новенькое. Может быть char[] (char*)?!
>>>>
>>>>Наскока я помню (чесно говоря, на С давно уже не писал), char[]
>>>>есть ничто иное как указатель на char, т.е. char*. Или я
>>>>не прав?!
>>>
>>>Домашнее задание:
>>>
>>>#include
>>>int main(int argc, char *argv[]) {
>>> char s[80] = «Hello»;
>>>
>>> strcat(s, «, World!»);
>>>}
>>>
>>>#include
>>>int main(int argc, char *argv[]) {
>>> char *s ;
>>> strcat(s, «, World!»);
>>>}
>>>
>>>Найти 10-ть отличий и понять, почему первое работает, а второе — нет.
>>>
>>
>>Нашел место поумничать?!
>
>Это Вы, Пан, умничаете. Посмотрите первую, строчку, которая до сих пор идет
>в квотировании. А теперь turnon(&brain);
>
>>char s[80] char* = new char(80);
>
>>>>Наскока я помню (чесно говоря, на С давно уже не писал)
>
>Хреновые у Вас познания в Си. new таки пережитки плюсавого.
>
>>За исключением того что память выделяется в разных местах, но это не
>>имеет отношения к исходному вопросу.
>
>Опять таки пернули в лужу. В первом сключае char[] она размещается в
>стеке, а в другом в куче. А в целом, конечно, можно
>продолжать мести пургу. только в одиночку.
Гениально!
вы перевернули мир, а раньше считал, что конструкция
char *s = «Hello»; создает масив длиной в 6 битов а оказалось это просто розмещается в куче, буду знать, а то чтобы масив вообще розмещать в стеке, ГАГАГАГА, я представляю масив
«ПЕРВЫМ ПРИШЕЛ ПОСЛЕДНИМ ВЫШЕЛ», спасибо, буду знать

https://www.opennet.ru/openforum/vsluhforumID9/5218.html
Правда на С++

>char *s = «Hello»; создает масив длиной в 6 битов а оказалось

Школьный курс информатики: БИТ != БАЙТ.

>»ПЕРВЫМ ПРИШЕЛ ПОСЛЕДНИМ ВЫШЕЛ», спасибо, буду знать

Массив — это последовательность. Последовательнисти основательно изучаются на первом курсе университета/института. Всё в Ваших руках.

>>char *s = «Hello»; создает масив длиной в 6 битов а оказалось
>
>Школьный курс информатики: БИТ != БАЙТ.
>
>>»ПЕРВЫМ ПРИШЕЛ ПОСЛЕДНИМ ВЫШЕЛ», спасибо, буду знать
>
>Массив — это последовательность. Последовательнисти основательно изучаются на первом курсе университета/института. Всё
>в Ваших руках.

не стоит чеплятся за опечатки насчет ,бита, но то что вы написано просто гон

>не стоит чеплятся за опечатки насчет ,бита,

++

>> «ПЕРВЫМ ПРИШЕЛ ПОСЛЕДНИМ ВЫШЕЛ», спасибо, буду знать

FILO — это тоже очепятка по Вашему?!

Последним пришёл первым вышел — LIFO
Первым пришёл первым вышел — FIFO

А что за нововведение с FILO?

Батенька, да у Вас Очепятки получается на каждом шагу. Читаем самостоятельно, что люди понимают под LIFO и под массивом. Ключевой вопрос, возможно обращение произвольному элементу в LIFO/FIFO? А в массиве? Результат: идем в садик.

> но то что вы написано
>просто гон

Аргументируешь? Желательно кодом.

>>не стоит чеплятся за опечатки насчет ,бита,
>
>++
>
>>> «ПЕРВЫМ ПРИШЕЛ ПОСЛЕДНИМ ВЫШЕЛ», спасибо, буду знать
>
>FILO — это тоже очепятка по Вашему?!
>
>Последним пришёл первым вышел — LIFO
>Первым пришёл первым вышел — FIFO
>
>А что за нововведение с FILO?
>
>Батенька, да у Вас Очепятки получается на каждом шагу. Читаем самостоятельно, что
>люди понимают под LIFO и под массивом. Ключевой вопрос, возможно обращение
>произвольному элементу в LIFO/FIFO? А в массиве? Результат: идем в садик.
>
>
>> но то что вы написано
>>просто гон
>
>Аргументируешь? Желательно кодом.

Вы хотите сказать что первый елемент уйдет не последним?
Вы просто чепляетесь за слова,
я просто росмеялся когда уведил это «В первом сключае char[] она размещается в стеке, а в другом в куче». и все, Какое отношение все это имеет к стеку? Вот в чом суть.

>Ключевой вопрос, возможно обращение
>произвольному элементу в LIFO/FIFO? А в массиве? Результат: идем в садик.
я же то и имел ввиду, можно конечно же реализовать масив ввиде стека, но это смешно, хотя
по вашему char[] тоже и делает.

Что теперь не так?

Господа, прекратите, пожалуйста, флейм. Что вы пытаетесь друг другу доказать?
Чтобы развеять неясности, внесу свои пять копеек.

Говоря о стеке, chip подразумевал сегмент памяти, в котором размещаются локальные переменные (например массив, объявленный в функции как char str[80]), а не способ хранения набора элементов, как подумал господин, пожелавший остаться безымянным. Кучей (heap) называют сегмент памяти, в котором размещаются динамически выделяемые области (например, функцией malloc(3) в C). Раз уж зашёл разговор о сегмантах памяти, то ещё бывает сегмент кода, в котором находятся инструкции программы и сегмент данных, в котором размещаются глобальные переменные, константы и пр. (то есть области, размер которых известен до старта программы). Всё это, разумеется, подробно описано во множестве мест, так что любой интересующийся (если вдруг такие тут окажутся) сможет легко это найти.

К разговору выше: что касается char[] и char*, то в использовании (если исключить выделение/освобождение памяти), особенно в контексте вопроса, они в общем-то похожи. Точнее, больше похожи char[] и char *const. Но всё это действительно не имеет отношения к вопросу. Да и спор-то возник только из-за желания поспорить. И из-за того, что GeKa ошибочно принял коментарий chip’а (5-й) на свой адрес, хотя он был адресован автору темы.

А по сути: действительно, если даты имеются в строковом представлении и формат их именно YYYY-MM-DD hh-mm-ss, то можно сравнить две строки, так что Geka предложил правильное и остроумное решение, хотя и зависящее от формата дат.

И не нужно ссориться, мы же здесь чтобы помочь друг другу, а не чтобы показать, кто круче.


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ Рекомендовать для помещения в FAQ]

как сравнить 2 даты в c++

Чтобы сравнить две даты в формате год-месяц-день, strcmp достаточно:

assert(strcmp("2012/09/13", "2012/09/12") > 0); assert(strcmp("2012/10/13", "2013/01/12") < 0); 

Поделиться 26 июня 2013 в 12:14

Вы можете использовать strptime для разбора дат в любом формате, если хотите, а затем mktime для преобразования структуры tm в значение time_t , которое вы можете сравнить.

Поделиться 26 июня 2013 в 12:12

Для чего это стоит, так как ваши примерные даты string curr_date = "2012/09/13" и string curr_date = "2012/09/13" , кажется, находятся в формате ISO8601 (кроме использования '/' в качестве разделителя). Радость ISO8601 заключается в том, что лексикографический порядок такой же, как и хронологический. это сортирует строки и сортирует по времени.

Это привлекательно, так как предоставляет хороший способ справиться с множеством дат (в отличие от всего лишь 2)

#include #include #include using namespace std; int main() < vectorv = getDates(); //Made up function returning a vector of ISO dates sort(v, v.begin(), v.end()); //Done //Do whatever you have to return 0; > 

Поделиться 26 июня 2013 в 12:15

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

Например, вы можете определить функтор следующим образом:

struct DateLessThan < BOOL operator()(const std::string& lhs, const std::string& rhs) < // the following is pseudocode split lhs and rhs into arrays of strings based on the delimiter "/" convert the string arrays into integers and store them in vars (possibly lhs_day, lhs_month, etc.) if (lhs_year < rhs_year) return true; else if (lhs_year == rhs_year) < if (lhs_month < rhs_month) return true; else if (lhs_month == rhs_month) < if (lhs_day < rhs_day) return true; >> return false; > >; 

Поделиться 26 июня 2013 в 13:10

strptime() - это то, что вы ищете. К сожалению, не просто заставить его работать на Windows.

Хотя после многого поиска в Google я наконец нашел реализацию, связанную с ffmpeg.org, которая справится с задачей. Реализация находится на plibc.sourceforge.net (Совместимая с POSIX библиотека для Windows) здесь.

Вам придется удалить номера строк, если вы собираетесь скопировать их из doxygen с помощью этого регулярного выражения 00([0-9])([0-9])([0-9]) .. Также возникает ошибка @ line 115 enum locale_status < not, loc, raw >; , который нужно изменить на enum locale_status < nott, loc, raw >; .

В качестве альтернативы, если вы слишком ленивы по всему этому, вот версия, которую я использовал:

/* Convert a string representation of time to a time value. Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ void get_locale_strings(void); /* XXX This version of the implementation is not really complete. Some of the fields cannot add information alone. But if seeing some of them in the same format (such as year, week and weekday) this is enough information for determining the date. */ #include #include #include #include #define match_char(ch1, ch2) if (ch1 != ch2) return NULL #ifndef Macintosh #if defined __GNUC__ && __GNUC__ >= 2 # define match_string(cs1, s2) \ (< size_t len = strlen (cs1); \ int result = strncasecmp ((cs1), (s2), len) == 0; \ if (result) (s2) += len; \ result; >) #else /* Oh come on. Get a reasonable compiler. */ # define match_string(cs1, s2) \ (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1)) #endif #else # define match_string(cs1, s2) \ (strncmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1)) #endif /* mac */ /* We intentionally do not use isdigit() for testing because this will lead to problems with the wide character version. */ #define get_number(from, to, n) \ do < \ int __n = n; \ val = 0; \ while (*rp == ' ') \ ++rp; \ if (*rp < '0' || *rp >'9') \ return NULL; \ do < \ val *= 10; \ val += *rp++ - '0'; \ >while (--__n > 0 && val * 10 = '0' && *rp to) \ return NULL; \ > while (0) # define get_alt_number(from, to, n) \ /* We don't have the alternate representation. */ \ get_number(from, to, n) #define recursive(new_fmt) \ (*(new_fmt) != '\0' \ && (rp = strptime_internal (rp, (new_fmt), tm, decided)) != NULL) /* This version: may overwrite these with versions for the locale */ static char weekday_name[][20] = < "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" >; static char ab_weekday_name[][10] = < "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" >; static char month_name[][20] = < "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" >; static char ab_month_name[][10] = < "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" >; static char am_pm[][4] = ; # define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y" # define HERE_D_FMT "%y/%m/%d" # define HERE_T_FMT_AMPM "%I:%M:%S %p" # define HERE_T_FMT "%H:%M:%S" static const unsigned short int __mon_yday[2][13] = < /* Normal years. */ < 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 >, /* Leap years. */ < 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 >>; /* Status of lookup: do we use the locale data or the raw data? */ enum locale_status < nott, loc, raw >; # define __isleap(year) \ ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) /* Compute the day of the week. */ void day_of_the_week (struct tm *tm) < /* We know that January 1st 1970 was a Thursday (= 4). Compute the the difference between this data in the one on TM and so determine the weekday. */ int corr_year = 1900 + tm->tm_year - (tm->tm_mon < 2); int wday = (-473 + (365 * (tm->tm_year - 70)) + (corr_year / 4) - ((corr_year / 4) / 25) + ((corr_year / 4) % 25 < 0) + (((corr_year / 4) / 25) / 4) + __mon_yday[0][tm->tm_mon] + tm->tm_mday - 1); tm->tm_wday = ((wday % 7) + 7) % 7; > /* Compute the day of the year. */ void day_of_the_year (struct tm *tm) < tm->tm_yday = (__mon_yday[__isleap (1900 + tm->tm_year)][tm->tm_mon] + (tm->tm_mday - 1)); > char * strptime_internal (const char *rp, const char *fmt, struct tm *tm, enum locale_status *decided) < const char *rp_backup; int cnt; size_t val; int have_I, is_pm; int century, want_century; int have_wday, want_xday; int have_yday; int have_mon, have_mday; have_I = is_pm = 0; century = -1; want_century = 0; have_wday = want_xday = have_yday = have_mon = have_mday = 0; while (*fmt != '\0') < /* A white space in the format string matches 0 more or white space in the input string. */ if (isspace (*fmt)) < while (isspace (*rp)) ++rp; ++fmt; continue; >/* Any character but `%' must be matched by the same character in the iput string. */ if (*fmt != '%') < match_char (*fmt++, *rp++); continue; >++fmt; /* We need this for handling the `E' modifier. */ start_over: /* Make back up of current processing pointer. */ rp_backup = rp; switch (*fmt++) < case '%': /* Match the `%' character itself. */ match_char ('%', *rp++); break; case 'a': case 'A': /* Match day of week. */ for (cnt = 0; cnt < 7; ++cnt) < if (*decided != loc && (match_string (weekday_name[cnt], rp) || match_string (ab_weekday_name[cnt], rp))) < *decided = raw; break; >> if (cnt == 7) /* Does not match a weekday name. */ return NULL; tm->tm_wday = cnt; have_wday = 1; break; case 'b': case 'B': case 'h': /* Match month name. */ for (cnt = 0; cnt < 12; ++cnt) < if (match_string (month_name[cnt], rp) || match_string (ab_month_name[cnt], rp)) < *decided = raw; break; >> if (cnt == 12) /* Does not match a month name. */ return NULL; tm->tm_mon = cnt; want_xday = 1; break; case 'c': /* Match locale's date and time format. */ if (!recursive (HERE_T_FMT_AMPM)) return NULL; break; case 'C': /* Match century number. */ get_number (0, 99, 2); century = val; want_xday = 1; break; case 'd': case 'e': /* Match day of month. */ get_number (1, 31, 2); tm->tm_mday = val; have_mday = 1; want_xday = 1; break; case 'F': if (!recursive ("%Y-%m-%d")) return NULL; want_xday = 1; break; case 'x': /* Fall through. */ case 'D': /* Match standard day format. */ if (!recursive (HERE_D_FMT)) return NULL; want_xday = 1; break; case 'k': case 'H': /* Match hour in 24-hour clock. */ get_number (0, 23, 2); tm->tm_hour = val; have_I = 0; break; case 'I': /* Match hour in 12-hour clock. */ get_number (1, 12, 2); tm->tm_hour = val % 12; have_I = 1; break; case 'j': /* Match day number of year. */ get_number (1, 366, 3); tm->tm_yday = val - 1; have_yday = 1; break; case 'm': /* Match number of month. */ get_number (1, 12, 2); tm->tm_mon = val - 1; have_mon = 1; want_xday = 1; break; case 'M': /* Match minute. */ get_number (0, 59, 2); tm->tm_min = val; break; case 'n': case 't': /* Match any white space. */ while (isspace (*rp)) ++rp; break; case 'p': /* Match locale's equivalent of AM/PM. */ if (!match_string (am_pm[0], rp)) if (match_string (am_pm[1], rp)) is_pm = 1; else return NULL; break; case 'r': if (!recursive (HERE_T_FMT_AMPM)) return NULL; break; case 'R': if (!recursive ("%H:%M")) return NULL; break; case 's': < /* The number of seconds may be very high so we cannot use the `get_number' macro. Instead read the number character for character and construct the result while doing this. */ time_t secs = 0; if (*rp < '0' || *rp >'9') /* We need at least one digit. */ return NULL; do < secs *= 10; secs += *rp++ - '0'; >while (*rp >= '0' && *rp break; case 'S': get_number (0, 61, 2); tm->tm_sec = val; break; case 'X': /* Fall through. */ case 'T': if (!recursive (HERE_T_FMT)) return NULL; break; case 'u': get_number (1, 7, 1); tm->tm_wday = val % 7; have_wday = 1; break; case 'g': get_number (0, 99, 2); /* XXX This cannot determine any field in TM. */ break; case 'G': if (*rp < '0' || *rp >'9') return NULL; /* XXX Ignore the number since we would need some more information to compute a real date. */ do ++rp; while (*rp >= '0' && *rp tm_wday = val; have_wday = 1; break; case 'y': /* Match year within century. */ get_number (0, 99, 2); /* The "Year 2000: The Millennium Rollover" paper suggests that values in the range 69-99 refer to the twentieth century. */ tm->tm_year = val >= 69 ? val : val + 100; /* Indicate that we want to use the century, if specified. */ want_century = 1; want_xday = 1; break; case 'Y': /* Match year including century number. */ get_number (0, 9999, 4); tm->tm_year = val - 1900; want_century = 0; want_xday = 1; break; case 'Z': /* XXX How to handle this? */ break; case 'E': /* We have no information about the era format. Just use the normal format. */ if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y' && *fmt != 'x' && *fmt != 'X') /* This is an invalid format. */ return NULL; goto start_over; case 'O': switch (*fmt++) < case 'd': case 'e': /* Match day of month using alternate numeric symbols. */ get_alt_number (1, 31, 2); tm->tm_mday = val; have_mday = 1; want_xday = 1; break; case 'H': /* Match hour in 24-hour clock using alternate numeric symbols. */ get_alt_number (0, 23, 2); tm->tm_hour = val; have_I = 0; break; case 'I': /* Match hour in 12-hour clock using alternate numeric symbols. */ get_alt_number (1, 12, 2); tm->tm_hour = val - 1; have_I = 1; break; case 'm': /* Match month using alternate numeric symbols. */ get_alt_number (1, 12, 2); tm->tm_mon = val - 1; have_mon = 1; want_xday = 1; break; case 'M': /* Match minutes using alternate numeric symbols. */ get_alt_number (0, 59, 2); tm->tm_min = val; break; case 'S': /* Match seconds using alternate numeric symbols. */ get_alt_number (0, 61, 2); tm->tm_sec = val; break; case 'U': case 'V': case 'W': get_alt_number (0, 53, 2); /* XXX This cannot determine any field in TM without further information. */ break; case 'w': /* Match number of weekday using alternate numeric symbols. */ get_alt_number (0, 6, 1); tm->tm_wday = val; have_wday = 1; break; case 'y': /* Match year within century using alternate numeric symbols. */ get_alt_number (0, 99, 2); tm->tm_year = val >= 69 ? val : val + 100; want_xday = 1; break; default: return NULL; > break; default: return NULL; > > if (have_I && is_pm) tm->tm_hour += 12; if (century != -1) < if (want_century) tm->tm_year = tm->tm_year % 100 + (century - 19) * 100; else /* Only the century, but not the year. Strange, but so be it. */ tm->tm_year = (century - 19) * 100; > if (want_xday && !have_wday) < if ( !(have_mon && have_mday) && have_yday) < /* we don't have tm_mon and/or tm_mday, compute them */ int t_mon = 0; while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon] tm_yday) t_mon++; if (!have_mon) tm->tm_mon = t_mon - 1; if (!have_mday) tm->tm_mday = tm->tm_yday - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1; > day_of_the_week (tm); > if (want_xday && !have_yday) day_of_the_year (tm); return (char *) rp; > char * strptime (const char *buf, const char *format, struct tm *tm) < enum locale_status decided; #ifdef HAVE_LOCALE_H if(!have_used_strptime) < get_locale_strings(); /* have_used_strptime = 1; might change locale during session */ >#endif decided = raw; return strptime_internal (buf, format, tm, &decided); > #ifdef HAVE_LOCALE_H void get_locale_strings(void) < int i; struct tm tm; char buff[4]; tm.tm_sec = tm.tm_min = tm.tm_hour = tm.tm_mday = tm.tm_mon = tm.tm_isdst = 0; tm.tm_year = 30; for(i = 0; i < 12; i++) < tm.tm_mon = i; strftime(ab_month_name[i], 10, "%b", &tm); strftime(month_name[i], 20, "%B", &tm); >tm.tm_mon = 0; for(i = 0; i < 7; i++) < tm.tm_mday = tm.tm_yday = i+1; /* 2000-1-2 was a Sunday */ tm.tm_wday = i; strftime(ab_weekday_name[i], 10, "%a", &tm); strftime(weekday_name[i], 20, "%A", &tm); >tm.tm_hour = 1; /* in locales where these are unused, they may be empty: better not to reset them then */ strftime(buff, 4, "%p", &tm); if(strlen(buff)) strcpy(am_pm[0], buff); tm.tm_hour = 13; strftime(buff, 4, "%p", &tm); if(strlen(buff)) strcpy(am_pm[1], buff); > #endif 

И вот рабочий пример:

#include #include #include #include #include #include #include "strptime.h" using namespace std; int main() < struct tm tm1, tm2; time_t t1, t2; memset(&tm1, 0, sizeof(struct tm)); memset(&tm2, 0, sizeof(struct tm)); strptime("12 February 2010", "%d %b %Y", &tm1); strptime("11 February 2010", "%d %b %Y", &tm2); t1 = mktime(&tm1); t2 = mktime(&tm2); cout t2) < cout t2" else if (t1 == t2) < cout << "t1 == t2" else if (t1 < t2) < cout << "t1 < t2" cout

Outputs:

1265925600 1265839200 t1 > t2 86400 

C# — Как можно сравнить время(DateTime)?

Всем привет. Я начинающий программист. На днях столкнулся с проблемой: Как сравнить время? Например, беру настоящее время(DateTime.Now) и хочу сравнить его с определенным временем которое мне нужно, например:
Сейчас 11:44, а мне нужно выяснить: нахожусь ли я в промежутке времени между 11:30 и 12:30, и сколько осталось(если осталось) времени до конца промежутка. Как это можно реализовать? Буду рад любой помощи)

  • Вопрос задан более трёх лет назад
  • 19662 просмотра

Комментировать
Решения вопроса 1
пофиг на чем писать

var periodFrom = new DateTime(2017, 10, 5, 11, 30, 0); var periodTo = new DateTime(2017, 10, 5, 12, 30, 0); var periodNow = DateTime.Now; if (periodNow > periodFrom && periodNow < periodTo) < Console.WriteLine("between"); >else < Console.WriteLine("not between"); >// timeFrom и timeTo выбирай вариант какой нужен var timeFrom = periodFrom.TimeOfDay; var timeTo = periodTo.TimeOfDay; var timeFrom1 = new TimeSpan(11, 30, 0); var timeTo1 = new TimeSpan(12, 30, 0); var timeNow = DateTime.Now.TimeOfDay; if (timeNow > timeFrom1 && timeNow < timeTo1) < Console.WriteLine("between"); >else

Ответ написан более трёх лет назад
Нравится 2 6 комментариев
artemkaw @artemkaw Автор вопроса

Спасибо. А можно сравнивать просто время в 24 часовом формате (H:mm)? Ведь так проверки хватит только на сегодняшний день, а завтра наступит новое число, а тут сравнение со вчерашним

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

var timeFrom1 = new TimeSpan(11, 30, 0);
var timeTo1 = new TimeSpan(12, 30, 0);

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *