有趣的事实是,我确信我们大多数人都能在时间领域发挥作用 - 有些日期/时间可能看似有效但实际上并不存在,例如:上午2:30,夏令时切换时间。
在C ++(标准版或Windows版)中是否有办法确定给定日期/时间在给定时区规范中是否有效?
答案 0 :(得分:1)
#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存储库:
答案 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”,您必须执行以下操作: