Стандарты C и C++ абсолютно ничего не говорят ни о каком календаре, кроме григорианского, да и о нем почти ничего.
1.
месяцев в году
Единственное, что вы найдете, это комментарий в стандарте C рядом с членом tm_mon
из tm
:
int tm_mon; // months since January -- [0, 11]
Ну почти только. Вы также найдете спецификаторы %b
и %B
в strftime
, которые соответствуют сокращенному и полному названию месяца текущей локали, соответствующему tm_mon
.
2.
дней в неделе
У тебя есть:
int tm_wday; // days since Sunday -- [0, 6]
и %a
, %A
вместо strftime
.
3.
часов в сутках
У тебя есть:
int tm_hour; // hours since midnight -- [0, 23]
Есть также спецификаторы strftime
, некоторые из которых чувствительны к текущей локали.
4.
минут в часе
int tm_min; // minutes after the hour -- [0, 59]
Также в этом случае вам поможет новая библиотека C++11 <chrono>
:
std::cout << std::chrono::hours{1}/std::chrono::minutes{1} << '\n';
Это будет переносимо (и последовательно) выводить 60
. Если ваш компилятор поддерживает constexpr
и вас беспокоит эффективность, эта величина может быть интегральной константой времени компиляции:
constexpr auto minutes_per_hour = std::chrono::hours{1}/std::chrono::minutes{1};
Тип minutes_per_hour
гарантированно является целым числом со знаком и имеет длину не менее 29 бит.
5.
секунд в минуте
Спецификация C немного интересна в этом:
int tm_sec; // seconds after the minutes -- [0, 60]
Диапазон не задокументирован как [0, 59]
, чтобы можно было добавить положительную дополнительную секунду. При этом ни одна известная мне ОС не реализует точный учет високосных секунд. Кажется, что все следуют Unix Time, которое отслеживает UTC, за исключением игнорирования високосных секунд. Когда происходит дополнительная секунда, все ОС, о которых я знаю, просто рассматривают это как обычную коррекцию часов. Известно, что Google рассматривает это как мазок исправлений в каком-то окне время.
Кроме того, вы можете последовательно и переносимо писать:
std::cout << std::chrono::minutes{1}/std::chrono::seconds{1} << '\n';
и получить 60
.
Хотя это и не определено стандартами C или C++, каждая ОС, по-видимому, измеряет время с Нового 1970 года (пренебрегая високосными секундами). а>). В С++ 11 это количество доступно через:
auto tp = std::chrono::system_clock::now();
где tp
будет иметь тип std::chrono::system_clock::time_point
. Это time_point
имеет неопределенную точность (две недели, секунды, фемтосекунды, что угодно). Точность определяется программно во время компиляции.
Если это будет полезно, эта ссылка содержит код, который может переводить tp
в год/месяц/день час :минута:секунда и даже доли секунды (и наоборот). О, день недели, если хотите (и несколько других календарных трюков). Этот общедоступный код зависит от нестандартной, но де-факто портативной эпохи Нового 1970 года. Его можно легко адаптировать к другим эпохам, если когда-либо возникнет необходимость.
person
Howard Hinnant
schedule
17.02.2015