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