Как я могу добавить большое количество секунд для объекта time_t?

Ну, я думаю, что название подводит итог. Предположим, у меня есть объект типа double который я получил от бега std::difftime на двух time_t объекты, и теперь я хочу добавить полученное количество секунд назад к time_t объект. Я не против потерять доли секунды.

Обратите внимание, что количество секунд может быть большим (т.е. больше, чем 60 секунд, разрешенных в struct tm, но всегда ниже, чем любой целочисленный примитив, используемый для представления секунд на соответствующем компьютере / реализации, и никогда не превышает порядка 1 года, хотя желательно, чтобы это не было ограничением).

Как мне поступить так : (согласно стандарту C)?

Я надеюсь, что мне не придется делить на месяцы, дни, часы, минуты и т. Д. И добавлять их вручную в struct tm объект. Конечно, есть лучший способ!?

3 ответа

Решение

Вам разрешено выполнять арифметику с time_t ценности.

Вы можете настроить два struct tm объекты с интервалом в одну секунду (выбирайте два раза где-то в середине минуты, где високосные секунды не допускаются, и в местное время, когда летнее время не изменяется), и вызывайте mktime() на них обоих, чтобы получить два time_t ценности. Вычтите более раннюю из тех time_t значения из более поздних, и это даст вам секунду в том же количестве единиц, в которых time_t измеряется в вашей системе. Умножьте это на количество секунд, которое вы хотите добавить, и добавьте результат к вашему оригиналу. time_t значение. Вы можете проверить результат, снова позвонив difftime() на оригинал и новый time_tзначения, чтобы увидеть, если разница в секундах, что вы ожидали.

Обратите внимание, что даже это не обязательно будет переносимым, так как технически, time_t не требуется даже разрешение, способное различать секунды, но это будет довольно странная реализация, которой нет. Кроме того, если time_t является значением с плавающей запятой (что необычно), и вы хотите добавить действительно очень большое количество секунд, вы можете столкнуться с проблемами точности с плавающей запятой. В этом случае вы можете попробовать добавить часы, например, вместо секунд, и настроить ваши два struct tm структурирует соответственно. Вы можете предположительно столкнуться с проблемами переполнения с достаточно большим количеством секунд, с которыми вы просто не можете ничего поделать.

Использование localtime конвертировать ваши time_t значение в struct tm, который содержит время в часах, минутах, секундах и т. д. Отрегулируйте количество секунд соответствующим образом, затем используйте mktime преобразовать значения в структуре в time_t,

Похоже, дубликат этого.

"Тип даты / времени C time_t реализован в виде количества секунд с определенной даты, поэтому для добавления секунд к нему вы просто используете обычную арифметику".

Даже если это в C, не должно быть никакой разницы в C++:)

Другие вопросы по тегам