找出最近N天的夏令时安全时间

时间:2012-06-01 10:09:09

标签: c++ datetime timezone timezone-offset

让我们说今天是星期一。我想知道上周三的日期是什么时候。

我认为的逻辑是 1)从今天到上周六(即6)没有天差 2)从今天开始减去那么多秒

time_t now = time(0);
// determine the no of day differences i.e 6
time_t lastWeekTime = now - (86400 * 6);

这不是DST安全的。有人可以告诉我在这里需要注意什么。?

提前致谢

2 个答案:

答案 0 :(得分:0)

您可以使用localtime将time_t转换为tm结构。此结构包含作为值的日期 - 您可以添加/减去。您必须确保在必要时更改月/年。正确更改后,您可以使用mktime将其转换回来。

尴尬但可管理。这样您就不需要了解DST,只需知道天/月和月/年的数量。

更好的方法可能是使用Boost Date Time

答案 1 :(得分:0)

日期没有DST的概念,只适用于日期时间,因为您需要一天中的一小部分来描述您是在转换之前还是之后。因此,2012年6月1日星期五始终是2012年6月1日星期五,无论当天,或之前或之后发生多少次DST切换。

您的方式已经是正确的方式,time()将为您提供自(unix)纪元以来的秒数,并且该比例未观察到夏令时开关,因此lastWeekTime % 86400将完全是与now % 86400相同(实际上根据您的计算)。因此,如果您只需要日期,请确保不打印时间组件,例如从结果中减去now % 86400并仅使用UTC函数(gmtime() / timegm())。

如果您想要这样的话:今天是星期一,预约时间是11:00。我想在N天之后准确地移动它。然后使用您的算法从星期一N天开始,并手动设置时间部分:

time_t now = time(NULL);
time_t then = now - 86400 * N;
time_t then_eleven = (then - then % 86400) + 11 * 3600;