如何判断两个winrt::Calendar实例是否为同一天/同一小时?
如何可靠判断winrt::Calendar实例是否为同一天/同一小时?
直接用Compare方法会精确到纳秒,显然不满足按天、按小时判断的需求;而直接清零时、分、秒字段的做法确实存在时区、夏令时相关的风险,比如夏令时切换当天的时间调整可能导致日期偏移。可靠的做法是将两个Calendar统一到同一时区后,提取关键时间字段对比,具体如下:
判断是否为同一天
- 先将两个Calendar实例转换到同一个时区(推荐用UTC,避免夏令时、时区偏移带来的日期计算误差)
- 分别提取它们的年、月、日字段
- 对比这三个字段是否完全一致
示例代码:
bool IsSameDay(winrt::Calendar const& cal1, winrt::Calendar const& cal2) { // 转换为UTC时区的Calendar实例 auto cal1Utc = winrt::Calendar::GetCalendarForLanguage( cal1.Language(), winrt::CalendarIdentifiers::Gregorian(), winrt::ClockIdentifiers::TwentyFourHour(), winrt::TimeZoneIdentifiers::Utc() ); cal1Utc.SetDateTime(cal1.GetDateTime()); auto cal2Utc = winrt::Calendar::GetCalendarForLanguage( cal2.Language(), winrt::CalendarIdentifiers::Gregorian(), winrt::ClockIdentifiers::TwentyFourHour(), winrt::TimeZoneIdentifiers::Utc() ); cal2Utc.SetDateTime(cal2.GetDateTime()); // 对比年、月、日 return cal1Utc.Year() == cal2Utc.Year() && cal1Utc.Month() == cal2Utc.Month() && cal1Utc.Day() == cal2Utc.Day(); }
比如你提到的April 28, 2023 at 3:12PM PDT和April 28, 2023 at 11:31AM PDT,转换到UTC后年、月、日完全一致,会返回true;而May 12, 2021 at 1:24PM PDT和May 12, 2023 at 1:24PM PDT年份不同,会返回false。
判断是否为同一小时
在同一天判断的基础上,增加对比小时字段即可:
bool IsSameHour(winrt::Calendar const& cal1, winrt::Calendar const& cal2) { auto cal1Utc = winrt::Calendar::GetCalendarForLanguage( cal1.Language(), winrt::CalendarIdentifiers::Gregorian(), winrt::ClockIdentifiers::TwentyFourHour(), winrt::TimeZoneIdentifiers::Utc() ); cal1Utc.SetDateTime(cal1.GetDateTime()); auto cal2Utc = winrt::Calendar::GetCalendarForLanguage( cal2.Language(), winrt::CalendarIdentifiers::Gregorian(), winrt::ClockIdentifiers::TwentyFourHour(), winrt::TimeZoneIdentifiers::Utc() ); cal2Utc.SetDateTime(cal2.GetDateTime()); return cal1Utc.Year() == cal2Utc.Year() && cal1Utc.Month() == cal2Utc.Month() && cal1Utc.Day() == cal2Utc.Day() && cal1Utc.Hour() == cal2Utc.Hour(); }
为什么不建议直接清零时分秒?
直接修改原Calendar的Hour(0)、Minute(0)等字段,可能触发时区规则的自动调整。比如在夏令时切换的时区,当你把凌晨2:30的时间清零到00:00时,系统可能会因为夏令时的偏移,自动将日期调整到前一天或后一天,导致判断结果错误。而统一到UTC时区后提取字段对比,能彻底规避这类时区相关的陷阱。
内容的提问来源于stack exchange,提问作者citelao
相关产品推荐
相关产品推荐

