【问题标题】:Find out DST safe time of last N days找出最近 N 天的 DST 安全时间
【发布时间】:2012-06-01 10:09:08
【问题描述】:

假设今天是星期一。我想知道上周三是几号。

我认为的逻辑是 1) 从今天到上周六的天数差(即 6 天) 2)从今天减去那几秒

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

这不是 DST 安全的。谁能告诉我这里需要注意什么?

提前致谢

【问题讨论】:

标签: c++ datetime timezone timezone-offset


【解决方案1】:

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

尴尬但易于管理。这样您就不需要了解 DST,而只需要了解天数/月数和月/年数。

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

【讨论】:

    【解决方案2】:

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

    您的方式已经是正确的方式,time() 会给您自 (unix) Epoch 以来的秒数,并且该比例不遵守夏令时开关,因此 lastWeekTime % 86400 将与 @987654323 完全相同@ (实际上根据您的计算)。因此,如果您只需要日期,请确保不要打印时间组件,例如通过从结果中减去 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 2020-04-01
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多