Как добавить один день ко времени, полученному из time ()

У меня есть время, представленное в виде количества секунд, прошедших с полуночи 1 января 1970 года по Гринвичу (результаты более раннего вызова time ()). Как мне добавить один день к этому времени?

Добавление 24 * 60 * 60 работает в большинстве случаев, но не получается, если летнее время включается или выключается между ними. Другими словами, я в основном хочу добавить 24 часа, но иногда 23 или 25 часов.

Для иллюстрации - программа:

#include <time.h>
#include <iostream>

int main()
{
  time_t base = 1142085600;
  for(int i = 0; i < 4; ++i) {
    time_t time = base + i * 24 * 60 * 60;
    std::cout << ctime(&time);
  }
  return 0;

}

Производит:

Sat Mar 11 08:00:00 2006
Sun Mar 12 09:00:00 2006
Mon Mar 13 09:00:00 2006
Tue Mar 14 09:00:00 2006

Я хочу, чтобы время для 12, 13 марта ... тоже было 8 утра.

Ответ, предоставленный FigBug, указал мне правильное направление. Но мне пришлось использовать местное время вместо gmtime.

int main()
{
  time_t base = 1142085600;
  for(int i = 0; i < 4; ++i) {
    struct tm* tm = localtime(&base);
    tm->tm_mday += i;
    std::cout << asctime(tm);
 }
 return 0;
}

Дай мне:

Sat Mar 11 08:00:00 2006
Sat Mar 12 08:00:00 2006
Sat Mar 13 08:00:00 2006
Sat Mar 14 08:00:00 2006

Что я и хочу. Использование gmtime дает мне время в 14:00:00

Тем не менее, обратите внимание, что все дни сб. Кроме того, это относится к 32, 33 марта и т. Д. Если я добавлю функцию mktime, я вернусь к тому, с чего начал:

#include <time.h>
#include <iostream>

int main()
{
  time_t base = 1142085600;
  for(int i = 0; i < 4; ++i) {
    struct tm* tm = localtime(&base);
    tm->tm_mday += i;
    time_t time = mktime(tm);
    std::cout << asctime(tm);
 }
 return 0;
}

Дает мне:

Sat Mar 11 08:00:00 2006
Sun Mar 12 09:00:00 2006
Mon Mar 13 09:00:00 2006
Tue Mar 14 09:00:00 2006

Что мне не хватает ???

Хорошо, я опробовал последнее предложение FigBug, которое должно использовать:

 std::cout << ctime(&time);

вместо asctime, но я получаю те же результаты. Поэтому я предполагаю, что моя библиотека и / или компилятор испорчены. Я использую G ++ 3.4.4 на Cygwin. Я скопировал файлы в Solaris 5.8 и использовал g ++ 3.3 для компиляции. Я получаю правильные результаты там! На самом деле я получаю правильные результаты, использую ли я ctime или asctime для вывода:

Sat Mar 11 08:00:00 2006
Sun Mar 12 08:00:00 2006
Mon Mar 13 08:00:00 2006
Tue Mar 14 08:00:00 2006

Я также получаю правильные результаты (с обеими функциями вывода) на Red Hut Linux с g ++ 3.4.6.

Итак, я думаю, что я столкнулся с ошибкой Cygwin.

Спасибо за вашу помощь и советы ....

Ответы на вопрос(5)

Ваш ответ на вопрос