Стандарты 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 классно относится к нему как к smear of corrections over some window of time.
Кроме того, вы можете последовательно и переносимым написать:
std::cout << std::chrono::minutes{1}/std::chrono::seconds{1} << '\n';
и получить 60
.
Пока не определено C или C++ стандартам, каждая ОС, как представляется, измерения времени с тех пор Новый год 1970 (neglecting leap seconds). В C++ 11 эта величина доступна через:
auto tp = std::chrono::system_clock::now();
tp
, где будет иметь тип std::chrono::system_clock::time_point
. Этот time_point
имеет неуказанную точность (форт, секунды, фемтосекунды, что угодно). Точность программно обнаруживается во время компиляции.
В случае полезно, this link содержит код, который может перевести tp
в год/месяц/день час: минуты: секунды и даже доли секунды (и наоборот). О, день недели, если вы этого хотите (и несколько других календарных трюков).Этот код общедоступного домена зависит от нестандартного, но де-факто переносной эпохи Нового Года 1970 года. Он может быть легко принят в другие эпохи, если это когда-нибудь возникнет.
Если вы посмотрите на календарь на иврите, вы увидите, что оно другое. http://en.wikipedia.org/wiki/Hebrew_calendar – NathanOliver
@NathanOliver интересный, так что я думаю, что это может иметь реальный случай использования в мире за пределами стандартного определения предела? –