Как я могу создать std::chrono::time_point на 1 января 1970 года 00:00:00?

Существует ли переносимый стандартный способ создания std::chrono::time_point на 1 января 1970 года, 00:00:00? Это должно быть потокобезопасным. Поэтому в решении следует избегать таких функций, как std::gmtime() и std::localtime(), которые не имеют гарантий потокобезопасности.

Это не дубликат Convert std::chrono::time_point в метку времени unix поскольку мне нужно портативное решение, которое является поточно-ориентированным. Ни вопрос там не требует этого, ни ответы не дают этой гарантии.


person Ralph Tandetzky    schedule 04.11.2016    source источник
comment
Это звучит как два вопроса: 1) как создать конкретный момент времени - нет проблем с потоком, 2) как получить текущее время - потенциальные проблемы с потоком.   -  person wally    schedule 04.11.2016
comment
Возможный дубликат Преобразовать std::chrono::time_point в метку времени unix   -  person Captain Giraffe    schedule 04.11.2016
comment
Остерегаться. Стандарт Posix не определяет эпоху, а затем полагается на обычное значение секунд и с тех пор. Он определяет полные секунды фразы с начала эпохи, и это не означает, что вы, возможно, думали, что это означает.   -  person Martin Bonner supports Monica    schedule 04.11.2016
comment
@CaptainGiraffe Это не дубликат, так как я прошу переносимое и потокобезопасное решение. Там вопрос об этом не просит и ответы этих гарантий не дают.   -  person Ralph Tandetzky    schedule 04.11.2016
comment
AFAIK, gmtime и localtime являются потокобезопасными в MSVC.   -  person Danh    schedule 04.11.2016
comment
Если я смогу получить это: open-std. org/jtc1/sc22/wg21/docs/papers/2016/p0355r1.html стандартизирован, то созданный по умолчанию std::chrono::time_point{} будет переносимо представлять 1970-01-01 00:00:00 UTC. Это будет потокобезопасно и молниеносно (требуется сохранение 64-битного нуля).   -  person Howard Hinnant    schedule 04.11.2016
comment
@HowardHinnant Было бы здорово иметь что-то стандартизированное, что можно было бы безопасно использовать. Особенно было бы очень полезно напечатать time_point в ostream без вызова небезопасных для потоков функций из древности C. Также очень помогло бы извлечение компонентов даты и времени из time_point.   -  person Ralph Tandetzky    schedule 07.11.2016


Ответы (1)


На практике std::chrono::system_clock::from_time_t(0) вернет нужное вам значение.

В принципе, я не вижу, как именно то, что вы хотите.

В качестве альтернативы можно вычислить это значение один раз (при запуске), прежде чем запустятся несколько потоков.

person Martin Bonner supports Monica    schedule 04.11.2016
comment
Фраза На практике звучит не очень переносимо. Действительно, тип std::time_t явно не определен в стандарте. - person Ralph Tandetzky; 04.11.2016
comment
Я согласен, что тип std::time_t не определен. Под на практике я имел в виду, что не знаю ни одной текущей реализации, в которой это не будет работать. Это может вызвать у вас проблемы со встроенными системами, которые не являются Posix (но системы с небольшими размерами, как правило, программируются на C, а не на C++), и я не знаю об операционной системе IBM (AIX будет в порядке). - person Martin Bonner supports Monica; 04.11.2016
comment
Обратите внимание, что std::time_t по определению is является арифметическим, поэтому буквальный ноль преобразуется в него без труда. - person Martin Bonner supports Monica; 04.11.2016
comment
На самом деле, я обнаружил, что передача mktime(&tm) вместо 0 должна работать, где tm имеет тип std::tm с соответствующими установленными полями. - person Ralph Tandetzky; 04.11.2016
comment
Великолепный! Я думаю, что это было бы уместно в качестве ответа. - person Martin Bonner supports Monica; 04.11.2016