Я уверен, что на этот вопрос есть ответ в другом месте, но я не могу найти его в Google или SO, так что здесь идет.
В C / C ++ я хочу преобразовать относительное время в формат дд-чч: мм: сс, предоставленный
ps -o etime
к абсолютной дате в формате UTC.
Это не похоже, что это должно быть очень сложно. Предположим, у меня уже есть функция для генерации относительного времени, хранящегося в формате struct tm:
struct tm *starting_rel_time = my_reltime_converstion(...);
time_t t = time(0);
struct tm *current_abs_time = localtime(&t);
то, что я хочу, в основном противоположно difftime:
struct *tm starting_abs_time = current_abs_time - starting_rel_time;
Теперь я могу написать свою собственную функцию для преобразования, но это кошмар из-за всех операций переноса и особых условий (високосные годы и т. Д.). Конечно, есть способ сделать это в библиотеках C / C ++?
Преобразовать DD-HH:MM::SS
в секундах с простой математикой; это относительное время, так что просто умножьте и добавьте. Затем запросите current time()
в секундах (при условии, что это «относительно сейчас»), и добавьте их. Тогда используйте gmtime
преобразовать обратно в struct tm
,
использование Повысьте :: дата_время библиотеки.
Нет такого языка как C / C ++.
Если вы спрашиваете о C, я предлагаю представлять даты внутри с простым числовым типом, и преобразовывать в и из struct tm
только когда это необходимо. Если вам нужно покрыть только несколько десятилетий, то вы можете использовать time_t
и конвертировать, используя стандарт gmtime
а также mktime
библиотечные функции. Чтобы охватить более широкий промежуток времени, вы можете использовать Юлианский день представление.
Если вы спрашиваете о C ++, я предлагаю Boost.Date_Time библиотека. Конечно, функции библиотеки C все еще доступны, если они отвечают вашим потребностям.
То, что вы пытаетесь сделать, не имеет смысла. Вы не можете добавить две даты.
(А также difftime
не возвращает ни дату, ни time_t
.)
На практике на большинстве, если не на всех реализациях, time_t
будет
целочисленный тип с количеством секунд, начиная с некоторой определенной «эпохи».
На таких машинах вы можете добавить или вычесть целое число секунд
из time_t
чтобы получить новое время, по крайней мере, если вы все время
заинтересованы в интервале, поддерживаемом time_t
(примерно между
1970 и 2038 на большинстве платформ Unix). Это, наряду с gmtime
,
mktime
а также localtime
вероятно, достаточно для ваших нужд. Заметка
особенно это mktime
требуется «исправить» это tm
вход: вы
может, например, взять tm
, добавьте 5 к полю tm_mday
, вызов
mktime
и получите правильные значения для даты пять дней в
будущее — все необходимые операции переноса и специальные
условия обрабатываются в mktime
,
Если этого недостаточно, C ++ 11 имеет как time_point
и
duration
класс, с (с первого взгляда), кажется, имеет все
функциональность, которая может вам понадобиться.