我有一個時間表示爲自1970年1月1日午夜以來UTC(早期調用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
我想時間13 3月12日......至上午八時。
由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
但是,請注意,所有的日子都是週六。此外,它關係到三月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
我在想什麼???
OK,我已經嘗試了FigBug的最新建議,那就是使用:
std::cout << ctime(&time);
代替asctime,但我得到了相同的結果。所以我想我的庫和/或編譯器搞砸了。我在cygwin上使用g ++ 3.4.4。我將這些文件複製到Solaris 5.8並在那裏使用g ++ 3.3進行編譯。我在那裏得到正確的結果!事實上,我得到正確的結果是否我使用的ctime或asctime輸出:在Red必勝客的Linux
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
我也得到正確的結果(具有輸出功能)與G ++ 3.4.6。
所以我想我遇到了Cygwin的錯誤。
感謝您對所有您的幫助和建議....
我想你想在最終版本中使用ctime而不是asctime,因爲您希望在當地時區使用該時間。 time()返回UTC,localtime()將其轉換爲您的時區。在您的時區添加一天,然後轉換回UTC。用ctime()在你的時區打印出來。很混亂。 – 2008-11-22 01:49:33
再多一行:tm-> tm_wday =(tm-> tm_wday + i)%7; – 2008-11-22 02:40:35
您不必擔心:從mktime文檔: timeptr的成員tm_wday和tm_yday的原始值將被忽略,並且其餘成員的值的範圍不限於其正常值(像tm_mday在1和31之間)。 – 2008-11-22 04:08:43