у меня есть double
содержащие секунды. Я хотел бы преобразовать это в struct tm
,
Я не могу найти стандартную функцию, которая выполняет это. Должен ли я заполнить struct tm
рукой?
я просто случайно спросил это о преобразовании в time_t
а также http://www.StackOverflow.com не позволит мне опубликовать, если я не буду связывать его.
Ну, вы случайно задали правильный вопрос раньше. Перерабатывать double
в time_t
, а затем преобразовать это в struct tm
, Там нет второго поля в struct tm
тем не мение.
Для ухмылки, используя этот chrono
основанная на заголовке библиотека:
#include "date.h"#include <iostream>
int
main()
{
using namespace std::chrono;
using namespace date;
auto recovery_time = 320.023s; // Requires C++14 for the literal 's'
std::cout << make_time(duration_cast<milliseconds>(recovery_time)) << '\n';
}
выходы:
00:05:20.023
Объект, возвращаемый make_time
есть получатели, если вы хотите запросить каждое поле:
constexpr std::chrono::hours hours() const noexcept {return h_;}
constexpr std::chrono::minutes minutes() const noexcept {return m_;}
constexpr std::chrono::seconds seconds() const noexcept {return s_;}
constexpr precision subseconds() const noexcept {return sub_s_;}
Вам не нужно выбирать milliseconds
, Вы можете выбрать любую точность, какую захотите hours
в picoseconds
(если вы также указали псевдоним типа для picoseconds
). Например:
std::cout << make_time(duration_cast<seconds>(recovery_time)) << '\n';
Выходы:
00:05:20
MSalters ответ это правильно, но я думал, что я хотел бы добавить немного подробностей о как вы должны преобразовать в time_t
и как вы должны преобразовать в tm
,
Так, учитывая количество секунд в double input
Вы можете использовать зависит от реализации способ литья:
const auto temp = static_cast<time_t>(input);
Но с тех пор time_t
Если реализация определена, нет способа узнать, что это примитив, к которому можно просто привести. Таким образом, гарантированный метод будет использовать библиотеку хроно независимый от реализации метод конвертации:
const auto temp = chrono::system_clock::to_time_t(chrono::system_clock::time_point(chrono::duration_cast<chrono::seconds>(chrono::duration<double>(input))));
Варианты конвертации обсуждаются более подробно здесь: https://stackoverflow.com/a/50495821/2642059 но как только вы получили свой time_t
с помощью одного из этих методов вы можете просто использовать localtime
преобразовать temp
к struct tm
,
const auto output = *localtime(&temp);
Обратите внимание на разыменование важно. Он будет использовать оператор копирования по умолчанию, так output
фиксируется значением, которое необходимо, потому что:
Структура может быть разделена между
std::gmtime
,std::localtime
, а такжеstd::ctime
и может быть перезаписано при каждом вызове.