У меня есть время, представленное в виде количества секунд, прошедших с полуночи 1 января 1970 года по Гринвичу (результаты более раннего вызова времени ()). Как мне добавить один день к этому времени?
Добавление 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.
Спасибо за вашу помощь и совет ....