0

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

例如:

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

我需要能够确定咖啡店目前是否在世界上营业。在此示例中,由于纽约只有美国东部标准时间 23:00,因此它仍然会营业。

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

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

4

1 回答 1

0

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
}
于 2011-05-10T07:33:14.207 回答