Std chrono system clock

Я программирую код C ++, который работает на встроенном Linux BusyBox. Мой код и его библиотеки имеют несколько вызовов std::chrono::system_clock::now() чтобы узнать текущее время.

С тех пор мой ящик был настроен как часовой пояс по умолчанию (UTC), и все работает нормально, процессы запущены и результаты в порядке.

Теперь я должен был установить свой Linux, чтобы остаться в другом часовом поясе. Тогда я сделал это, настроив в коробке /etc/profile :

Когда я выпускаю date Команда и консоль я получаю правильное время, но мои звонки std::chrono::system_clock::now() Я все еще получаю время UTC, а не время, указанное в date команда (правильное время).

Я не хочу менять все свои now() вызовов — их сотни … И это приводит к тому, что мои процессы работают с разным временем, чем правильное время, установленное на консоли.

Есть ли способ решить это без изменения моего кода? Что-то, что мне здесь не хватает?

Спасибо за помощь.

Решение

Хотя это не указано в стандарте, каждая реализация std::chrono::system_clock::now() отслеживает Unix Time , что очень близко к UTC.

Если вы хотите перевести std::chrono::system_clock::now() по местному времени, вы можете перевести system_clock::time_point в time_t с помощью system_clock::to_time_t и затем проложите свой путь через C API (например, localtime ), или вы можете попробовать эту современную библиотеку часовых поясов, которая построена поверх :

Вы бы использовали это, чтобы получить текущее местное время следующим образом:

make_zoned это фабричная функция, которая возвращает тип zoned_time с какой бы то ни было точностью system_clock поддерживает (например, наносекунды). Это спаривание time_zone и system_clock::time_point ,

Вы можете получить local_time который является std::chrono::time_point как это:

Хотя библиотека имеет удаленный API для загрузки База данных часовых поясов IANA автоматически, этот API может быть отключен путем компиляции с -DHAS_REMOTE_API=0 , Это все подробно описано в Инструкция по установке . Если удаленный API отключен, вам придется вручную загружать базу данных из База данных часовых поясов IANA (это просто tar.gz ).

Читайте также:  Java построение графиков по точкам

Если вам нужно текущее смещение UTC, это можно получить так:

В приведенном выше фрагменте я использую "chrono_io.h" найдено в том же хранилище github для печати offset , offset имеет тип std::chrono::seconds , Это просто вывод для меня:

Наконец, если вы хотите узнать имя IANA вашего текущего часового пояса, это просто:

что для меня просто вывод:

Тип, возвращаемый из name() является std::string , При желании можно записать эту строку, а затем использовать time_zone с этим именем, даже если это не текущий часовой пояс компьютера:

I´m writing a C++ code that needs to access an old C library that uses timeval as a representation of the current time.

In the old package to get the current date/time we used:

Now I need to use C++ chrono, something as:

Later in code I need the way back, building a time_point variable from the returned struct timeval :

3 Answers 3

[Edited to use time_val instead of free vars]

Assuming you trust your system_clock with milliseconds accuracy, you can go like this:

Use std::chrono::microseconds in duration_cast and adjust your (div/mod) code accordingly for the higher precision — take care on how much you trust the accuracy of the values you obtain.

The conversion back is:

See std::chrono::system_clock::to_time_t() , which converts the time_point to a time_t , which becomes your tv_sec . You don’t get tv_usec , you can set it 0; or you could fiddle with a few other things, including duration_cast , in order to extract fractions of a second from your time_point .

from_time_t () does the reverse.

Here is how to do the conversion both without using manual conversion factors, or depending upon the unspecified rounding mode of time_t :

Читайте также:  Dead space код регистрации

to_timeval takes care to round the tp down (in case it is negative). The POSIX spec is a bit vague on this but I’m assuming that timeval represents time points prior to the epoch with negative tv_sec values, and then positive tv_usec values. Then it is a simple operation to find the microseconds since the last second .

If I’m incorrect about my assumption (and a more precise POSIX spec can be found), has the power to model whatever the heck it does.

The reverse conversion, assuming the conventions above, is incredibly readable. It requires no comment.

This can all be tested like this:

This is all predicated on the assumption that the epoch for timeval and system_clock are identical. This is not specified, but is true for all existing implementations. With any luck we can standardize this existing practice in the near future.

Be aware that in POSIX timeval is used both as a time_point and a duration . So to_time_point could result in a run time error if the timeval is currently representing a time duration. And to_timeval could result in a run time error if the client interprets the result as a time duration.

Clock classes provide access to the current time_point.

Specifically, system_clock is a system-wide realtime clock.

Clock properties

Member types

The following aliases are member types of system_clock:

Rate this post

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *