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

标签 c++ c date dst

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

相关文章:

c++ - VS2013 Unresolved External with 构造函数和析构函数

c++ - 在内核空间调用 NtQuerySystemInformation

C ifdef、else、endif 指令

Objective-C sqlite 在 LIKE 子句中添加查询参数

javascript - meteor 和 autoform 中的日期对象

SimpleDateFormat 中的 Java 日期模式在 SQL 数据库中不起作用

php - 将 MySQL 日期时间转换为非常特定的格式以进行导出

c++ - 运行时等待输入

c++ - 分别读取序列值和保存值

c - 将数据写入文件但文件仍然包含 NULL