2012-03-17 1 views
2

следующий коднеожиданный результат dateFromComponents:

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

+0

дубликат [Почему dateFromComponents NSCalendar возвращает неправильную дату?] (Http://stackoverflow.com/questions/4322687/why-nscalendars-datefromcomponents-returns-wrong-date) –

ответ

2

Я предполагаю, что вы используете 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]); 
2

набор часовых пояса

NSCalendar *cal = [NSCalendar currentCalendar]; 

[cal setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; 
2

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

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

+0

На самом деле это совсем наоборот - вы не теряют информацию о часовом поясе при использовании dateFromComponents, она фактически учитывает часовой пояс и возвращает вам дату, которая имеет смысл для вашего * локального * часового пояса (по умолчанию). По существу, если вы создаете компоненты с Today в качестве даты и 16:00 как время, созданная дата будет 16:00 по местному времени, если вы не используете NSCalendar с GMT, установленным как часовой пояс. – strangetimes

+0

@strangetimes Я не думаю, что мы не согласны, вы просто смотрите на это по-другому. – grahamparks

 Смежные вопросы

  • Нет связанных вопросов^_^