Находится ли текущий NSDate в местном часовом поясе в пределах диапазона начала и конца NSDate в другом часовом поясе? - PullRequest
0 голосов
/ 16 ноября 2010

Мне нужно определить, попадает ли текущая NSDate пользователя (местный часовой пояс) в диапазон двух NSDate, принадлежащих другим часовым поясам.

Например:

Я в Калифорнии, а сейчас 20:00 по тихоокеанскому времени. Кафе в Нью-Йорке открыто с 08:00 до 00:00 EST. Кафе хранится в виде этих точных значений и отправляется в XML вместе с полем tz, указывающим America / New_York.

Мне нужно определить, открыто ли кафе в мире в настоящее время. В этом примере, поскольку сейчас только 23:00 по восточному поясному времени в Нью-Йорке, он все еще будет открыт.

Я пытался использовать NSDate, NSTimeZone, NSCalendar, NSDateComponents для создания алгоритма преобразования, но я потерпел неудачу, и я просто, когда думаю, что понимаю это, снова запутываюсь. NSDate не имеет понятия часового пояса, поэтому я не могу понять, какое реальное значение существует в нем, так как вам нужно передать часовые пояса в NSDateFormatter, чтобы увидеть.

Как бы вы создали метод, чтобы определить, находится ли [дата NSDate] в [NSTimeZone localTimeZone] между двумя NSDate в другом часовом поясе?

1 Ответ

0 голосов
/ 10 мая 2011

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
}
...