本地时区的当前 NSDate 是不是在另一个时区的开始和结束 NSDate 范围内?

Posted

技术标签:

【中文标题】本地时区的当前 NSDate 是不是在另一个时区的开始和结束 NSDate 范围内?【英文标题】:Is current NSDate in local timezone within range of start and end NSDates in another timezone?本地时区的当前 NSDate 是否在另一个时区的开始和结束 NSDate 范围内? 【发布时间】:2010-11-16 04:03:32 【问题描述】:

我需要确定用户当前的 NSDate(本地时区)是否在属于其他时区的两个 NSDate 的范围内。

例如:

我在加利福尼亚,现在是太平洋标准时间 20:00。 纽约的一家咖啡店在美国东部标准时间 08:00 至 00:00 之间营业。咖啡店存储为这些精确值,并在 XML 中与指示 America/New_York 的 tz 字段一起发送。

我需要能够确定咖啡店目前在世界上是否营业。在此示例中,由于纽约仅 23:00 EST,因此它仍会营业。

我尝试过使用 NSDate、NSTimeZone、NSCalendar、NSDateComponents 来构建一个算法来进行转换,但我一直没有成功,当我认为我理解它时,我又感到困惑了。 NSDate 没有时区的概念,所以我无法弄清楚其中存在什么真正的价值,因为您需要将时区传递给 NSDateFormatter 才能看到。

您将如何创建一种方法来确定 [NSTimeZone localTimeZone] 中的 [NSDate date] 是否介于另一个时区的两个 NSDate 之间?

【问题讨论】:

更具体地说,我们需要首先使用今天的日期将时间和时区从 XML 引入到新的日期对象中。然后与移动用户的当前日期/时间和时区进行比较。 【参考方案1】:

NSDate 表示时间上的单个实例,与时区、日历等无关。

您需要做的就是将一个日期与其他两个日期进行比较,看看它是否位于它们之间。

听起来您的问题实际上是要比较实际日期,这并不难。这只是我头脑中的一个示例。

NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
calendar.timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
components.year = 2011;
...
components.hour = 8;
NSDate *opening = [calendar dateFromComponents:components];
components.day = components.day + 1;
components.hour = 0;
NSDate *closing = [calendar dateFromComponents:components];
NSDate *now = [NSDate date];

if ([opening compare:now] == NSOrderedAscending && [now compare:closing] == NSOrderedAscending) 
  // do stuff

或者,如果您将当前时间转换为目标时区的日期部分并检查小时部分,可能会更容易。这样您就不需要处理确保日期组件中的值没有超出范围的问题。另外,在一般情况下,计算开始和结束日期分量并不简单。

NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
calendar.timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
NSDate *now = [NSDate date];
NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:now];

if (components.hour > 0 && components.hour < 8) 
  // do stuff

【讨论】:

以上是关于本地时区的当前 NSDate 是不是在另一个时区的开始和结束 NSDate 范围内?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:将 UTC NSDate 转换为本地时区

NSDate 比较,找出特定(本地)时区的“午夜数”

NSDate获取当前时区的时间

CoreData 中的 NSDate 是不是封装了时区?

NSDate: 我只输入utc时间成分,并正确设置日历,但NSDate不知为何会被重新计算到我的时区。

如何计算不同时区的两个 NSDate 对象之间的天数差异?