Как установить определенное время с помощью библиотеки std :: chrono? - PullRequest
0 голосов
/ 10 октября 2019

Вместо использования std::chrono::system_clock::now();

я бы хотел установить свои собственные конкретные часы \ минуты \ секунды. Подобно тому, как можно было бы использовать struct tm для ручного построения даты и времени.

Каков наилучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 10 октября 2019

Я нашел решение, которое искал. См .: Решение от Говарда Хиннанта

Обычно вы должны использовать 24-часовую длительность

using days = std::chrono::duration<int, std::ratio<86400>>;
auto last_midnight = std::chrono::time_point_cast<days>(std::chrono::system_clock::now());

Затем добавьте к ней 24-часовую метку времени:)

0 голосов
/ 10 октября 2019

Любые часы, предоставленные <chrono>, относятся к эпохе, которая отличается от момента времени, к которому относится ваша входная дельта (основываясь на комментариях под вопросом). Таким образом, вы не должны пытаться использовать std::chrono::time_point экземпляры (с которыми имеют дело часы-экземпляры), а вместо этого std:chrono::duration. Последний является агностиком любой точки отсчета времени, как ваш вклад. В зависимости от единицы этого входа выберите одно из предопределенных std::duration экземпляров, например,

#include <chrono>

const int timestamp = getSecondsSinceMidnight();

const std::chrono::seconds sec{timestamp};

Теперь вы можете продолжить, например, вычесть другую временную метку и т. Д.

0 голосов
/ 10 октября 2019

Вы можете использовать UDL (пользовательские литералы) для создания длительности. Длительность может быть преобразована в timpoint с помощью конструктора std::chrono::time_point.

#include <iostream>
#include <chrono>

int main()
{
  using namespace std::literals::chrono_literals;

  auto nanoseconds_i = 3ns;
  auto nanoseconds_f = 3.1ns;

  std::cout << nanoseconds_i.count() << std::endl;
  std::cout << nanoseconds_f.count() << std::endl;
}
...