比较不同时区的 NSDate



我想比较和过滤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 问题。

相关内容

  • 没有找到相关文章

最新更新