跨时区比较NSDates

时间:2017-02-11 18:27:12

标签: objective-c timezone 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

在下一步中,我想比较TargetDate,Today和Tomorrow,以确定TargetDate是否介于今天和明天之间。这就是问题所在。当我比较日期时,我收到的答案当然不是在这些日期之间。

+ (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转换为本地时区,但我很困惑这是否是最佳解决方案。在this post中提到你不应该这样做,因为它会混淆整个问题。

有没有人有想法,如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

你遇到的问题实际上就在这里:

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开始。夏令时跳过00:00小时。
  • 如果您只是关心当天的某个点,而不是整个日,请在中午12:00进行比较,而不是在午夜00:00进行比较。它避免了DST问题。