当前位置:  开发笔记 > 编程语言 > 正文

如何将一天添加到从时间()获得的时间

如何解决《如何将一天添加到从时间()获得的时间》经验,为你挑选了3个好方法。

我有一个时间表示自UTC,1970年1月1日午夜以来经过的秒数(之前调用time()的结果).如何在这个时间添加一天?

在大多数情况下,添加24*60*60可以正常工作,但如果夏令时间在两者之间打开或关闭,则会失败.换句话说,我主要想要增加24小时,但有时候需要23或25小时.

举例说明 - 该计划:

#include 
#include 

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

我希望3月12日,13日的时间......也是早上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 
#include 

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

我也在Red Hut Linux上使用g ++ 3.4.6获得了正确的结果(带有两个输出函数).

所以我想我遇到了一个Cygwin错误.

感谢您的所有帮助和建议....



1> Roland Rabie..:

使用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;
}


转换为
)


2> Pyrolistical..:

只需添加24*60*60即可.它在DST期间不应该失败,因为UTC不会使用DST.

如果失败,那么您不会在代码中的某处使用UTC.消除时区依赖.



3> Andrew Seliv..:

FigBug的解决方案几乎每次都有效,但它需要DST修复:tm-> tm_isdst = -1

tm_isdst的正值或0值会导致mktime()最初假设夏令时分别在指定时间内有效或无效.tm_isdst的负值会导致mktime()尝试确定夏令时是否在指定时间内有效.

(引自mktime规范)

int main()
{
  time_t base = 1142085600;
  for(int i = 0; i < 4; ++i) {
    struct tm* tm = localtime(&base);
    tm->tm_mday += i;
    tm->tm_isdst = -1;        // don't know if DST is in effect, please determine
                              // this for me
    time_t next = mktime(tm);
    std::cout << ctime(&next);
 }
 return 0;
}

否则会有一个错误(莫斯科夏令时的例子,从2009年3月29日01:59:59开始):

int main()
{
    // 28 March 2009 05:00:00 GMT ( local - 08:00 (MSK) )
    time_t base = 1238216400;

    std::time_t start_date_t = base;
    std::time_t end_date_t = base;

    std::tm start_date = *std::localtime(&start_date_t);
    std::tm end_date = *std::localtime(&end_date_t);

    end_date.tm_mday += 1;
//    end_date.tm_isdst = -1;

    std::time_t b = mktime(&start_date);
    std::time_t e = mktime(&end_date);

    std::string start_date_str(ctime(&b));
    std::string stop_date_str(ctime(&e));

    cout << " begin (MSK) (DST is not active): " << start_date_str;
    cout << " end   (MSD) (DST is active):     " << stop_date_str;
}

输出:

begin (MSK) (DST is not active): Sat Mar 28 08:00:00 2009
end   (MSD) (DST is active):     Sun Mar 29 09:00:00 2009

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有