Может ли значение std :: chrono :: system_clock :: time_point меняться в зависимости от часового пояса? - PullRequest
0 голосов
/ 07 марта 2019

Я писал модульные тесты для класса в нашей кодовой базе, который в основном конвертирует дату, значения времени из std::string в std::chrono::time_point и наоборот, для разных типов временных отметок (гггг-мм-дд, чч: мм:ss.ms и т. д.).

Один из способов, которым я пытался проверить, должно ли std::chrono::system_clock::time_point, возвращаемое функцией в нашей кодовой базе, такой же, как и созданная в модульных тестах, сделать что-то вроде этого -

std::chrono::system_clock::time_point m_TimePoint{}; // == Clock's epoch
auto foo = convertToString(n_TimePoint); //foo is std::string
auto bar = getTimePoint(foo);
ASSERT_EQ(m_TimePoint, bar);

Это было в Ubuntu, теперь конструктор должен возвращать точку времени как UTC 1 января 00:00:00 1970 года. Теперь, когда я использовал ctime(), чтобы увидеть текстовое представление эпохи, которую он возвратил 31 декабря 19: 00: 00 1969. Я был озадачен и проверил, что EST (часовой пояс моей системы) равен UTC-5.

Как только я создал объект как -

std::chrono::duration d{0};
d += std::chrono::hours(5);
std::chrono::system_clock::time_point m_TimePoint{d}; //== clock epoch + 5 hours

Все работало нормально.

Мой вопрос: возможно ли настроить время системных часов на основе часового пояса системы?

1 Ответ

1 голос
/ 07 марта 2019

На этот вопрос есть два ответа, и я попытаюсь ответить на них обоих.

system_clock был представлен в C ++ 11, и его эпоха осталась неуказанной.Таким образом, технический ответ на ваш вопрос: да, возможно, что эпоха system_clock может быть скорректирована на основе системного часового пояса.

Но это еще не конец истории.

Есть только несколько реализаций system_clock, и все они модели Unix Time . Unix Time является мерой продолжительности времени с 1970-01-01 00:00:00 UTC, исключая високосные секунды.Он не зависит от часового пояса системы.

Проект спецификации C ++ 20 стандартизирует эту существующую практику.

Таким образом, с практической точки зрения ответ на ваш вопрос: нет, этоЭпоха system_clock не может быть настроена на основе системного часового пояса.

Одна вещь, которая может сбить вас с толку, состоит в том, что system_clock обычно считает время в единицах, меньших, чем миллисекунды.Он варьируется от платформы к платформе, и вы можете проверить, что это такое с system_clock::duration::period::num и system_clock::duration::period::den.Это две интегральные константы времени компиляции, которые образуют дробь, n/d, которая описывает отрезок времени в секундах, измеряемый system_clock.Для Ubuntu, я думаю, это будет фракция 1/1'000'000'000 или nanoseconds.

Вы можете получить milliseconds (или любую другую единицу измерения) из system_clock::time_point с:

auto tp = time_point_cast<milliseconds>(system_clock::now());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...