используйте gmtime () для преобразования time_t к , структура tm
добавляет тот ко дню ( tm_mday)
использование mktime () для преобразования структура tm назад к , time_t
видит time.h для большего количества информации
Редактирование:
я просто попробовал его, это работает:
int main()
{
time_t base = 1142085600;
for(int i = 0; i < 4; ++i) {
struct tm* tm = localtime(&base);
tm->tm_mday += i;
time_t next = mktime(tm);
std::cout << ctime(&next);
}
return 0;
}
Просто добавьте 24*60*60. Это не должно перестать работать в течение DST, так как UTC никогда не будет использовать DST.
, Если это перестало работать, затем Вы не используете UTC где-нибудь в Вашем коде. Удалите зависимость часового пояса.
Решение FigBug будет работать почти [1 110] каждый раз, но требуется DST, зафиксируйте: TM-> tm_isdst =-1
положительный А или 0 значений для tm_isdst заставляет mktime () предполагать первоначально, что Летнее время, соответственно, или не в действительности в течение требуемого времени. Отрицательная величина для tm_isdst заставляет mktime () пытаться определить, является ли Летнее время в действительности в течение требуемого времени.
(заключенный в кавычки от mktime спецификация )
int main()
{
time_t base = 1142085600;
for(int i = 0; i < 4; ++i) {
struct tm* tm = localtime(&base);
tm->tm_mday += i;
tm->tm_isdst = -1; // don't know if DST is in effect, please determine
// this for me
time_t next = mktime(tm);
std::cout << ctime(&next);
}
return 0;
}
Иначе будет ошибка (пример в течение Московского Летнего времени, которое запускает 29 марта 2009 1:59:59):
int main()
{
// 28 March 2009 05:00:00 GMT ( local - 08:00 (MSK) )
time_t base = 1238216400;
std::time_t start_date_t = base;
std::time_t end_date_t = base;
std::tm start_date = *std::localtime(&start_date_t);
std::tm end_date = *std::localtime(&end_date_t);
end_date.tm_mday += 1;
// end_date.tm_isdst = -1;
std::time_t b = mktime(&start_date);
std::time_t e = mktime(&end_date);
std::string start_date_str(ctime(&b));
std::string stop_date_str(ctime(&e));
cout << " begin (MSK) (DST is not active): " << start_date_str;
cout << " end (MSD) (DST is active): " << stop_date_str;
}
Вывод:
begin (MSK) (DST is not active): Sat Mar 28 08:00:00 2009
end (MSD) (DST is active): Sun Mar 29 09:00:00 2009
У меня всегда был лучший результат с хранением меток времени UTC, и преобразуйте их в указанный часовой пояс (включая переход на летнее время), когда Вы хотите отобразить значения.
Это сохраняет много стычки как это (и делает Вашу программу независимой от часовых поясов.