假设今天是星期一。我想知道上周三是几号。
我认为的逻辑是1)从今天到上周六的天数差异(即6)2)从今天减去那么多秒
time_t now = time(0);
// determine the no of day differences i.e 6
time_t lastWeekTime = now - (86400 * 6);
这不是 DST 安全的。有人能告诉我在这里我需要注意什么吗?
提前致谢
假设今天是星期一。我想知道上周三是几号。
我认为的逻辑是1)从今天到上周六的天数差异(即6)2)从今天减去那么多秒
time_t now = time(0);
// determine the no of day differences i.e 6
time_t lastWeekTime = now - (86400 * 6);
这不是 DST 安全的。有人能告诉我在这里我需要注意什么吗?
提前致谢
您可以使用localtime将 time_t 转换为 tm 结构。此结构包含作为值的天数 - 您可以添加/减去。您只需确保在必要时更改月份/年份。正确更改后,您可以使用mktime将其转换回来。
尴尬但易于管理。这样你就不需要知道 DST,而只需要知道天/月和月/年的数量。
更好的方法可能是使用Boost Date Time
日期没有 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;