Функция действительной даты с использованием ‹ctime› mktime


person Shoaib    schedule 02.05.2014    source источник


Ответы (1)


Возврат mktime выглядит следующим образом:

Время с эпохи как объект std::time_t в случае успеха или -1, если время не может быть представлено как объект std::time_t.

std::time_t определяется следующим образом:

Арифметический тип, способный представлять время.

Хотя это и не определено, это почти всегда целочисленное значение, содержащее количество секунд (не считая високосных секунд) с 00:00, Jan 1 1970 UTC, что соответствует Время POSIX.

Таким образом, 31/12/1920 не может быть представлено в виде std::time_t, как это было до эпохи.


Что касается других недопустимых дат, которые считаются действительными, mktime также указывает:

Значения в [параметре] могут быть вне их нормальных диапазонов.

Вот пример, взятый из cppreference:

#include <iostream>
#include <iomanip>
#include <ctime>

int main()
{
    std::time_t t = std::time(NULL);
    std::tm tm = *std::localtime(&t);
    std::cout << "Today is           " << std::put_time(&tm, "%c %Z") <<'\n';
    tm.tm_mon -= 100;  // tm_mon is now outside its normal range
    std::mktime(&tm);
    std::cout << "100 months ago was " << std::put_time(&tm, "%c %Z") << '\n';
}

Выход:

Today is Wed Dec 28 09:56:10 2011 EST
100 months ago was Thu Aug 28 10:56:10 2003 EDT

person Chnossos    schedule 02.05.2014
comment
Нет, я имею в виду, я ввел все недопустимые даты, но почти все они были выведены как действительные. И единственная действующая дата как недействительная. так что насчет всех остальных, почему они были действительны? - person Shoaib; 02.05.2014
comment
о, вы имеете в виду, что эта функция проверяет только год? тогда я не могу проверить день и месяц? - person Shoaib; 02.05.2014
comment
@ShoaibHaider Смотрите мое редактирование. Теперь должно быть яснее. - person Chnossos; 02.05.2014
comment
хорошо, так что они для разных вещей. Они позволяют переменным вне области действия увеличивать/уменьшать даты - person Shoaib; 02.05.2014
comment
Да, это делает mktime неподходящим инструментом для проверки дат. - person Chnossos; 02.05.2014