本地时区的当前 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 范围内?的主要内容,如果未能解决你的问题,请参考以下文章