Управление високосными секундами в управлении временем

Я только что узнал, что в конце этого месяца будет добавлена ​​дополнительная секунда (июнь 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, Но также потому, что я не знаю, как справиться с этим. что может быть хорошим способом?

0 ответов

Другие вопросы по тегам