неожиданный результат dateFromComponents: - PullRequest
2 голосов
/ 17 марта 2012

следующий код

NSCalendar *cal = [NSCalendar currentCalendar];
[cal setFirstWeekday:2];
[cal setMinimumDaysInFirstWeek:4];

NSDateComponents *comp = [[NSDateComponents alloc] init];
[comp setYear: 2012];
[comp setMonth:3];
[comp setDay: 12];
NSDate *date = [cal dateFromComponents:comp];
NSLog(@"date:%@",date);

журналы:

date:2012-03-11 23:00:00 +0000

Любая идея, почему это происходит и как избежать Tnx

Ответы [ 3 ]

2 голосов
/ 17 марта 2012

установить часовой пояс

NSCalendar *cal = [NSCalendar currentCalendar];

[cal setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
2 голосов
/ 17 марта 2012

Когда вы вызываете dateFromComponents:, вы теряете всю информацию о часовом поясе и календаре и получаете объект NSDate, который содержит момент времени, который представляют ваши компоненты даты, но ничего больше.Когда вы используете NSLog для объекта NSDate, этот момент времени преобразуется во время в формате UTC и отображается как читаемая человеком строка.

Вам необходимо предоставить больше информации о том, чего вы пытаетесь достичьчтобы иметь возможность ответить на второй вопрос о том, как этого избежать.

2 голосов
/ 17 марта 2012

Я предполагаю, что вы используете часовой пояс CET локально. Это то, что [NSCalendar currentCalendar] будет использовать в качестве часового пояса.

Когда вы выгружаете NSDate с помощью NSLog, вы получите дату в необработанном формате UTC. Чтобы напечатать дату в локальном формате, посмотрите на класс NSDateFormatter, который имеет свойство timeZone:

....
NSDate *date = [cal dateFromComponents:comp];
NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
fmt.timeZone = [NSTimeZone defaultTimeZone]; // Probably not required
NSLog(@"date:%@", [fmt stringFromDate:date]);
...