我有一个时间表示为自 UTC 1970 年 1 月 1 日午夜以来经过的秒数(早期调用 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 日……的时间也是上午 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 的时间
但是,请注意,所有日子都是星期六。此外,它会到 3 月 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,但我得到了相同的结果。所以我猜我的库和/或编译器搞砸了。我在 cygwin 上使用 g++ 3.4.4。我将文件复制到 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
我还在使用 g++ 3.4.6 的 Red Hut Linux 上获得了正确的结果(具有两个输出函数)。
所以我想我遇到了一个 Cygwin 错误。
谢谢大家的帮助和建议......