Как я могу добавить большое количество секунд для объекта 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++:)