Управление високосными секундами в управлении временем
Я только что узнал, что в конце этого месяца будет добавлена дополнительная секунда (июнь 2015 года). Я немного боюсь этого, потому что я провожу свой собственный урок времени. Я не уверен, что это достаточно надежно.
Я создал класс Instant
работая с unsigned long long int
переменная-член ms
это количество миллисекунд от 01/01/1600
в 0:00:00
,
Когда я хочу узнать текущее время, я вызываю эту функцию:
void Instant::setCurrentTime()
{
struct timeval tv;
gettimeofday(&tv, NULL);
this->ms = NBR_DAYS_TO_EPOCH; // 135140
this->ms *= NBR_SECONDS_IN_DAY; // 86400
this->ms += tv.tv_sec;
this->ms *= NBR_MILLISECONDS_IN_SECOND; // 1000
this->ms += tv.tv_usec/1000;
}
Мой первый вопрос: как високосные секунды влияют на это число? Это уже учтено в tv.tv_sec
значение? Как?
Мой второй вопрос о преобразовании в читабельный формат. Я не публикую это здесь, потому что моя функция довольно большая (я могу опубликовать ее, если потребуется), но идея заключается в следующем:
- Сначала я вычисляю количество секунд в текущем дне, а затем количество минут и часов;
- Я вычисляю количество дней до текущего дня;
- Затем я вычисляю количество циклов 400 лет (периодический процесс), количество циклов 100 лет в текущем цикле 400 лет и количество циклов 4 года в текущем цикле 4 года;
- Отсюда я делаю год (скачок или нет), месяц, день и день недели;
- Затем я проверяю, активировано ли летнее время, и обновляю значения в соответствии с зоной (Европа, США до 2007 года, США с 2007 года);
- Все это без учета 25 дополнительных секунд, добавленных с 1970 года.
На данный момент мой класс не может сказать "мы 30/06/2015
в 23:59:60
"потому что мое количество секунд ограничено 59
, Но также потому, что я не знаю, как справиться с этим. что может быть хорошим способом?