有没有办法确定日期/时间是否不存在?

时间:2016-04-08 07:02:51

标签: c++ windows boost time boost-date-time

有趣的事实是,我确信我们大多数人都能在时间领域发挥作用 - 有些日期/时间可能看似有效但实际上并不存在,例如:上午2:30,夏令时切换时间。

在C ++(标准版或Windows版)中是否有办法确定给定日期/时间在给定时区规范中是否有效?

3 个答案:

答案 0 :(得分:1)

使用此free, open-source library

#include "tz.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono_literals;
    try
    {
        auto zone = locate_zone("America/New_York");
        zone->to_sys(local_days{mar/13/2016} + 2h + 30min);
    }
    catch (const std::exception& e)
    {
        std::cout << e.what() << '\n';
    }
}

该程序的输出是:

2016-03-13 02:30 is in a gap between
2016-03-13 02:00:00 EST and
2016-03-13 03:00:00 EDT which are both equivalent to
2016-03-13 07:00:00 UTC

简而言之,此程序尝试使用时区“America / New_York”将2016-03-13 02:30:00的区域设置日期/时间转换为UTC。转换会抛出异常,因为本地时间不存在。如果本地时间不明确,例如从夏令时设置本地时钟时,也会抛出异常(使用不同的错误消息)。

如果需要,该库还提供了避免这些异常的语法。

适用于VS-2013,VS-2015,clang和gcc。它需要C ++ 11,C ++ 14或C ++ 1z。

上面的链接指向文档。这是github存储库:

https://github.com/HowardHinnant/date

答案 1 :(得分:1)

使用特定于Windows的功能,您可以a call to TzSpecificLocalTimeToSystemTime()后跟a call to SystemTimeToTzSpecificLocalTime()及相关时区。

完成后,如果两者不同,则您的时间无效,因为TzSpecificLocalTimeToSystemTime会将无效时间转换为&#34;真实&#34;时间。

bool IsValidTime(TIME_ZONE_INFORMATION tz, SYSTEMTIME st)
{
    SYSTEMTIME utcSystemTime, st2;
    TzSpecificLocalTimeToSystemTime(&tz, &st, &utcSystemTime);
    SystemTimeToTzSpecificLocalTime(&tz, &utcSystemTime, &st2);

    return (st != st2);
}

答案 2 :(得分:0)

time_t格式是一个整数值(自1970年1月1日00:00 00:00起的秒数),因此每个可能的time_t值都存在(当然使用的是整数类型的限制范围内)。

另一方面,并​​非所有可能的“struct tm”值(你有日,月,年,小时,分钟和秒的成员)都存在(这可能就是你的意思)。要检查是否存在“struct tm”,您必须执行以下操作:

  • 将成员tm_isdst设置为-1。这表明您不知道其是否为DST。
    • 使用mktime()将“struct tm”转换为time_t。
    • 使用localtime()将time_t转换回“struct tm”。
    • 将生成的“struct tm”与初始“struct tm”进行比较,忽略tm_isdst字段(或使用它来查看您是否在DST中)。