我想比较和过滤NSDates,以确定今天是否有关于用户当前时区的任何内容。
假设我有一个位于洛杉矶(UTC-8 小时(的用户和以下日期:
TargetDate
UTC: 2 pm (14:00) - 12. Feb 2017
LocalTime: 10 pm (22:00) - 12. Feb 2017
Now
UTC: 10 pm (22:00) - 11. Feb 2017 // Change of date!
LocalTime: 6 pm (06:00) - 12. Feb 2017
Today
UTC: 00 am (00:00) - 11. Feb 2017 // Begin of today
Tomorrow
UTC: 00 am (00:00) - 12. Feb 2017
在下一步中,我想比较目标日期,今天和明天,以确定目标日期是否在今天和明天之间。这就是问题所在。当我比较日期时,我得到的答案当然不是在这些日期之间。
+ (BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate
{
if ([date compare:beginDate] == NSOrderedAscending)
return NO;
if ([date compare:endDate] == NSOrderedDescending)
return NO;
return YES;
}
我能做的是将 UTC 日期TargetDate
转换为本地时区,但我非常困惑这是否是最佳解决方案。在这篇文章中提到你不应该这样做,因为它混淆了整个问题。
没有人有想法,如何解决这个问题?
您遇到的问题实际上在这里:
Today
UTC: 00 am (00:00) - 11. Feb 2017 // Begin of today
Tomorrow
UTC: 00 am (00:00) - 12. Feb 2017
您决定"天"是 UTC 日。 相反,您需要确定目标时区中的日期。
Today
LocalTime: 00 am (00:00) - 11. Feb 2017 // Begin of today
UTC: 08 am (08:00) - 11. Feb 2017 // Equivalent UTC
Tomorrow
LocalTime: 00 am (00:00) - 12. Feb 2017 // Begin of tomorrow
UTC: 08 am (08:00) - 12. Feb 2017 // Equivalent UTC
请记住其他一些事项:
- 与半开放间隔比较:
StartOfToday <= SomePointToday < StartOfTomorrow
(包括开始,排除结束(。 -
America/Los_Angeles
并不总是 UTC-8。 它在夏令时切换到 UTC-7。 - 并非每一天都从午夜开始。 例如,2016-10-16 的
America/Sao_Paulo
从 01:00 开始。 对于 DST,跳过了 00:00 小时。 - 如果你只关心当天的某个时间点,而不是一整天,比较中午12:00,而不是午夜00:00。 它避免了 DST 问题。