Ответ 1
NSDate представляет только абсолютную точку времени. Он не имеет понятия о часовом поясе или календаре. Когда вы создаете экземпляр NSDate, это всего лишь несколько секунд с 1 января 2001 года по Гринвичу! Неважно, находитесь ли вы в Нью-Йорке, Токио, Барселоне или Иерусалиме.
В вашем примере вы указываете NSDate на основе GMT, но [date description]
(используется в NSLog
) переводит его в ваше местное время. Там у вас есть несоответствие.
Итак, рассмотрим две части:
1. Создание NSDate с использованием NSCalendar и NSTimeZone
Если вы создаете дату вручную, вы должны указать календарь (2012 в григорианском, но 5772 на иврите) и часовой пояс (22 вечера по Лондону, но 7 утра по Сиднее).
// Use the user current calendar and time zone
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setTimeZone: [NSTimeZone systemTimeZone]];
// Specify the date components manually (year, month, day, hour, minutes, etc.)
NSDateComponents *timeZoneComps=[[NSDateComponents alloc] init];
[timeZoneComps setHour:22];
[timeZoneComps setMinute:0];
[timeZoneComps setSecond:0];
// ... year, month, ...
// transform the date compoments into a date, based on current calendar settings
NSDate *date = [calendar dateFromComponents:timeZoneComps];
В этот момент дата хранит точный момент времени (в секундах), представляющий текущий календарь.
2. Выход NSDate с использованием NSDateFormatter
Для управляемого вывода вашего NSDate вам потребуется NSDateFormatter, который используется для преобразования дат в строки.
На основе Apple Ссылка на класс NSDateFormatter
Есть много атрибутов, которые вы можете получить и установить на дату стиля formatter,... Однако вам рекомендуется не изменять индивидуальные настройки. Вместо этого вы должны принять настройки по умолчанию, установленные при инициализации, и указать формат, используя setDateStyle:, setTimeStyle:
Это особенно важно для вывода, который отличается для каждой локали. По умолчанию NSDateFormatter наблюдает за настройками локального пользователя. Таким образом, тот же NSDate может быть 22.11.2011 18:33:19
или Nov 22, 2011 6:33:19 PM
, или 2011-11-22 下午6:33:19
или даже २२-११-२०११ ६:३३:१९ अपराह्
, все для одного и того же ввода и с тем же кодом.
И код:
// NSDate *date -> NSString *dateString
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
// Medium style date, short style time => "Nov 23, 1937 3:30pm"
NSString *dateString = [dateFormatter stringFromDate:date];
Или вы можете преобразовать его с помощью метода класса localizedStringFromDate: dateStyle: timeStyle:
Надеюсь, это прояснит проблему.