不明白tm_struct(C ++)计算 - 是否存在某种偏移?

时间:2015-06-13 03:38:54

标签: c++ date datetime

我无法理解为什么C ++中的tm结构以这种方式运行。让我更具体一点 - 如果我要获得当前时间,我可能会做这样的事情

time_t now = time(0);
tm *nowTm = gmtime(&now);

在打印出日期后,我希望2015/06/13(截止日期为当前日期)

cout << nowTm->tm_year << "/" << nowTm->tm_mon << "/" << nowTm->tm_mday;

但相反,我发现它打印出1150/5/13而不是。对于月份值,我只需添加1即可将其设置为正确的月份,但玩弄这一年证明很麻烦。

我遇到过这个SO帖子:Algorithm to add or subtract days from a date?,据说从一年中减去1900以获得正确的年份。我试过没有用。

然后我尝试添加当前年份和1150之间的差异,2015 - 1150 = 865以获得正确的年份,但它给了我9800而不是2015

然后我尝试添加一年,并发现

  1. 如果我今年+1,它会以10年为增量上升。
  2. 如果我年+0.1,它会将日期除以0并加0.1(例如1150 + 1 = 115.01)。
  3. 我很困惑 - 为什么会发生这种情况?如何在我的tm结构中获得正确的年份?

1 个答案:

答案 0 :(得分:6)

documentation on tm我们可以看到:

  • tm_year是自1900年以来的年份,而不是当年的年数,即今年应为115岁。
  • tm_mon是自1月以来的月份(范围0-11),而不是月份的数量。

所以你需要的是:

std::cout << 1900 + nowTm->tm_year
   << "/" << 1 + nowTm->tm_mon
   << "/" << nowTm->tm_mday;