Добавьте две даты в Переполнение стека

Я уверен, что на этот вопрос есть ответ в другом месте, но я не могу найти его в 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 ++?

1

Решение

Преобразовать DD-HH:MM::SS в секундах с простой математикой; это относительное время, так что просто умножьте и добавьте. Затем запросите current time() в секундах (при условии, что это «относительно сейчас»), и добавьте их. Тогда используйте gmtime преобразовать обратно в struct tm,

2

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

использование Повысьте :: дата_время библиотеки.

3

Нет такого языка как C / C ++.

Если вы спрашиваете о C, я предлагаю представлять даты внутри с простым числовым типом, и преобразовывать в и из struct tm только когда это необходимо. Если вам нужно покрыть только несколько десятилетий, то вы можете использовать time_t и конвертировать, используя стандарт gmtime а также mktime библиотечные функции. Чтобы охватить более широкий промежуток времени, вы можете использовать Юлианский день представление.

Если вы спрашиваете о C ++, я предлагаю Boost.Date_Time библиотека. Конечно, функции библиотеки C все еще доступны, если они отвечают вашим потребностям.

1

То, что вы пытаетесь сделать, не имеет смысла. Вы не можете добавить две даты.
(А также 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 класс, с (с первого взгляда), кажется, имеет все
функциональность, которая может вам понадобиться.

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