Создание NSDate из NSDateComponents отключено на один день - PullRequest
1 голос
/ 06 сентября 2011

Я пытаюсь установить конкретную дату для юнит-теста:

NSCalendar *calendar = [[NSCalendar alloc]
                         initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setCalendar:calendar];
[components setYear:2011];
[components setMonth:5];
[components setDay:12];
[components setHour:1];
[components setMinute:0];
[components setSecond:0];

NSDate *date = [calendar dateFromComponents:components];
NSLog(@"Date I tried to set: %@", date);

Однако это выводит на печать "Дата, которую я пытался установить: 2011-05-11 17:00:00 +0000«.Дата кажется отодвинутой на один день, и я понятия не имею, почему она печатает время как 17:00:00.Почему это?

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

NSDate не имеет данных о часовом поясе, связанных с ним.Фактически, это всего лишь несколько секунд от «первого момента 1 января 2001 года по Гринвичу».Таким образом, компоненты даты и календарь создают NSDate, используя ваш местный часовой пояс.Это NSDate - правильное количество секунд с 01.01.2001 00:00 по Гринвичу, но когда вы регистрируете его, оно показывает вам дату в GMT вместо местного часового пояса.Если вы настроите это зарегистрированное время на свой часовой пояс, это будет 2011-05-12 01: 00: 00.

0 голосов
/ 04 октября 2016

Попробуйте

NSCalendar *calendar = [[NSCalendar alloc]
                         initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setCalendar:calendar];
[components setYear:2011];
[components setMonth:5];
[components setDay:12];
[components setHour:1];
[components setMinute:0];
[components setSecond:0];
[components setTimeZone:[NSTimeZone defaultTimeZone]];
NSDate *date = [calendar dateFromComponents:components];

или, может быть, вы хотите

 [components setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
...