Mam czas reprezentowany jako liczba sekund, które upłynęły od północy, 1 stycznia 1970, UTC (wyniki wcześniejszego połączenia z czasem()). Jak dodać jeden dzień do tego czasu?Jak dodać jeden dzień do czasu uzyskanego z czasu()
Dodawanie 24 * 60 * 60 działa w większości przypadków, ale kończy się niepowodzeniem, jeśli czas letni włącza się lub wyłącza w międzyczasie. Innymi słowy, najczęściej chcę dodać 24 godziny, ale czasami 23 lub 25 godzin.
Aby zilustrować - program:
#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;
}
Produkuje:
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
Chcę czasy w marcu 12, 13, ... być również 8 AM.
Odpowiedź udzielona przez FigBug wskazała mi właściwy kierunek. Ale musiałem użyć localtime zamiast 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;
}
Daj mi:
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
co jest, co chcę. Korzystanie z gmtime daje mi czas o 14:00:00
Należy jednak pamiętać, że wszystkie dni są Sat. Także, to idzie do marca 32, 33, itd Jeśli rzucę w funkcji mktime jestem tam, gdzie zacząłem:
#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;
}
Daje mi:
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
Czego mi brakuje ???
OK, starałem się najnowszą propozycję FigBug że jest użycie:
std::cout << ctime(&time);
zamiast asctime, ale mam takie same wyniki. Tak myślę, że moja biblioteka i/lub kompilator jest pomieszany. Używam g ++ 3.4.4 na cygwin. Skopiowałem pliki do Solaris 5.8 i użyłem g ++ 3.3 do kompilacji. Dostaję poprawne wyniki! W rzeczywistości uzyskać poprawne wyniki, czy używam ctime lub asctime wyjścia:
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
ja również uzyskać poprawne wyniki (z obu funkcji wyjściowych) na Red Hut Linux z g ++ 3.4.6.
Zgaduję, że natknąłem się na błąd Cygwina.
Dziękuję wszystkim za pomoc i radę ....
Myślę, że chcesz używać ctime nie asctime w ostatecznej wersji, ponieważ chcesz czas w lokalnej strefie czasowej. time() zwraca UTC, localtime() przekształca go w twoją strefę czasową. Dodaj jeden dzień do swojej strefy czasowej i powróć do UTC. Wydrukuj go w strefie czasowej za pomocą ctime(). Takie mylące. –
Jeszcze jedna linia: tm-> tm_wday = (tm-> tm_wday + i)% 7; –
Nie musisz się tym martwić: od mktime docs: Pierwotne wartości członków tm_wday i tm_yday timeptr są ignorowane, a zakresy wartości dla pozostałych członków nie są ograniczone do ich normalnych wartości (jak tm_mday między 1 a 31). –