Как создать системное время C ++ 11 из UT C Date (Thread-Safe) - PullRequest
2 голосов
/ 12 февраля 2020

Это не может быть так сложно, как примеры, которые я нашел в Интернете. Я пытаюсь создать std::chrono::system_time на основе некоторой даты UT C. Код, который я использую в одном потоке, следующий:

#include <chrono>
#include <iostream>

using namespace std;
using namespace chrono;

int main() {
    // Construct a time to be Jan 1, 2020 00:00:00 UTC
    static tm someTime{
        0, // seconds after the minute - [0, 60] including leap second
        0, // minutes after the hour   - [0, 59]
        0, // hours since midnight     - [0, 23]
        1, // day of the month         - [1, 31]
        0, // months since January     - [0, 11]
      120  // years since 1900
    };
    setenv("TZ", "UTC", 1);
    tzset();
    auto const time = system_clock::from_time_t(mktime(&someTime));
    setenv("TZ", "America/Denver", 1);
    tzset();
    auto const t = system_clock::to_time_t(time);
    cout << ctime(&t) << endl;
    return 0;
}

Обратите внимание, что я печатаю в другом часовом поясе, чтобы убедиться, что setenv работает. Есть ли потокобезопасный способ создания C ++ 11 раз с даты UT C?

1 Ответ

2 голосов
/ 12 февраля 2020

В C ++ 20 (да, я знаю, что у вас нет C ++ 20, просто придерживайтесь меня), вы сможете сделать это:

#include <chrono>

using namespace std::chrono;
system_clock::time_point someTime = sys_days{2020y/1/1};

Вы можете использовать этот синтаксис в C ++ 11 с использованием бесплатной библиотеки Ховарда Хиннанта с открытым исходным кодом, содержащей только заголовки :

#include "date/date.h"

using namespace date;
using namespace std::chrono;
system_clock::time_point someTime = sys_days{2020_y/1/1};

Разница в том, что новые имена находятся в namespace date вместо namespace std::chrono, а UDL y переименовывается в _y.

Это и эффективно, и поточно-ориентировано. Если вы предпочитаете кодировать его самостоятельно, вот алгоритмы, которые эта библиотека использует .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...