【问题标题】:Don't understand tm_struct (C++) calculations - is there an offset of some kind? [closed]不了解 tm_struct (C++) 计算 - 是否存在某种偏移? [关闭]
【发布时间】:2015-08-29 03:46:09
【问题描述】:

我不明白为什么 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. 如果 I +0.1 到年份,它会将日期除以零并加上 0.1(例如 1150 + 1 = 115.01)。

我很困惑 - 为什么会发生这种情况以及如何在我的 tm 结构中获得正确的年份?

【问题讨论】:

  • 您可能想在月份使用“tm_mday”,而不是“tm_mon”
  • @TrevorHickey, tm_mday 是一个月中的哪一天。
  • 您确定它打印的是1150 而不是115?因为115 是我期望的正确值。
  • 对我来说没问题。见ideone.com/F01Sb9
  • @CodeApprentice,请提供一个 MCVE 来输出您声明的内容。

标签: c++ date datetime


【解决方案1】:

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;

【讨论】:

  • 谢谢! :) 再次感谢所有评论的人 - 只是我粗心的失误导致了额外的 0 T_T
  • @CodeApprentice NP :) 我认为您在 cmets 中也错过了一个“1”,我怀疑您除以 0,哈哈。
猜你喜欢
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多