我有一个时间表示为自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