我有一个时间表示为自 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 提供的答案为我指明了正确的方向。但是我不得不使用 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 的时间
但是,请注意,所有日子都是星期六。此外,它会到 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 错误。
感谢您的所有帮助和建议......
最佳答案
使用 gmtime() 将 time_t 转换为 struct tm
一天加一个 (tm_mday)
使用 mktime() 将 struct tm 转换回 time_t
见 time.h了解更多信息
编辑:
我刚试了一下,效果很好:
int main()
{
time_t base = 1142085600;
for(int i = 0; i < 4; ++i) {
struct tm* tm = localtime(&base);
tm->tm_mday += i;
time_t next = mktime(tm);
std::cout << ctime(&next);
}
return 0;
}
关于c++ - 如何将一天添加到从 time() 获得的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/310363/