Я ищу правильный способ получения фактической даты и времени для данного места / часового пояса.
[NSDate date]
возвращает объект даты, представляющий текущую дату и время,не важно где вы находитесь.NSDate
s не зависят от мест или часовых поясов.Существует только одна NSDate, которая представляет сейчас или любой другой момент в этом отношении, а не разные объекты даты для каждого временного пояса.Поэтому не следует пытаться преобразовать дату между часовыми поясами.
NSDate
объекты представляют абсолютное мгновение во времени.Рассмотрим следующий пример того, как два представления даты в разных часовых поясах (9/9/11 3:54 PM
в Париже и 9/9/11 11:54 PM
в Сиднее) на самом деле являются одинаковыми датами.
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Paris"]];
NSDate *aDate = [formatter dateFromString:@"9/9/11 3:54 PM"];
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"Australia/Sydney"]];
NSDate *anotherDate = [formatter dateFromString:@"9/9/11 11:54 PM"];
NSLog(@"%@",anotherDate);
if ([aDate isEqualToDate:anotherDate]) {
NSLog(@"How about that?");
}
Оно регистрирует это последнее сообщение, потому что 9/9/11 3:54 PM
в Париже и 9/9/11 11:54 PM
в Сиднее фактически одинаковы во времени.Когда в Париже 9/9/11 3:54 PM
, в Сиднее 9/9/11 11:54 PM
.
оба дают отладчик и NSLog 2011-09-09 14:26:02, но сейчас 16:26поэтому я думаю, что он должен вернуть 16:26:02 + 0200
Когда дело доходит до вывода даты, имейте в виду, что метод NSDate
description
возвращает время в GMT, и вам нужноиспользовать NSDateFormatter
для создания строки даты, представляющей местное время в Париже, Сиднее и т. д. из даты:
NSDate *now = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"Australia/Sydney"]];
NSLog(@"%@",[formatter stringFromDate:now]); //--> 9/9/11 11:54 PM
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Paris"]];
NSLog(@"%@",[formatter stringFromDate:now]); //--> 9/9/11 3:54 PM
ОК, но если я хочу знать, еслиэто время после 15:00, как я могу это проверить?
Создайте объект NSDate, который представляет сегодня в 15:00 (местное время), и сравните его с «сейчас»:
NSDate *now = [NSDate date];
NSCalendar* myCalendar = [NSCalendar currentCalendar];
NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
fromDate:[NSDate date]];
[components setHour: 15];
[components setMinute: 0];
[components setSecond: 0];
NSDate *todayAt15 = [myCalendar dateFromComponents:components];
if ([now compare:todayAt15] == NSOrderedDescending) {
NSLog(@"After 15:00 local time");
}
Оказывается, @Oliver нужно было проверить, будет ли после 15:00 в Париже , поэтому ему нужно было создать дату, которая представляет сегодня в 15:00 по парижскому времени (не местноевремя).Пример того, как это сделать, см. В ответе Оливера.Просто чтобы быть ясным, мой третий фрагмент кода показывает, как проверить, если это после 15:00 по местному времени.