Конвертировать double в struct tm

у меня есть double содержащие секунды. Я хотел бы преобразовать это в struct tm,

Я не могу найти стандартную функцию, которая выполняет это. Должен ли я заполнить struct tm рукой?

я просто случайно спросил это о преобразовании в time_t а также http://www.StackOverflow.com не позволит мне опубликовать, если я не буду связывать его.

0

Решение

Ну, вы случайно задали правильный вопрос раньше. Перерабатывать double в time_t, а затем преобразовать это в struct tm, Там нет второго поля в struct tm тем не мение.

4

Другие решения

Для ухмылки, используя этот 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
2

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и может быть перезаписано при каждом вызове.

0
По вопросам рекламы [email protected]