2016-01-18 4 views
2

Когда я передаю [NSDate date] в NSDateComponents, а затем возвращаюсь после изменения дня недели, я всегда получаю час 16:00:00. Зачем ?Почему [calendar dateFromComponents:] всегда возвращает час 16?

Код сильфонных:

 { 
     NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
     NSDate *now = [NSDate date]; 
     NSLog(@"now = %@",now); 

     NSDateComponents *firstDayOfWeek = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday fromDate:now]; 
     firstDayOfWeek.weekday = 1; // Monday as first day of week 

     NSDate *firstDayOfWeekDate = [calendar dateFromComponents:firstDayOfWeek]; 
     NSLog(@"first day = %@", firstDayOfWeekDate); 
    } 

    { 
     NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
     NSDate *now = [NSDate date]; 
     NSLog(@"now = %@",now); 

     NSDateComponents *firstDayOfWeek = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:now]; 
     firstDayOfWeek.weekday = 1; // Monday as first day of week 
     firstDayOfWeek.hour = 1; 
     firstDayOfWeek.minute = 1; 
     firstDayOfWeek.second = 1; 

     NSDate *firstDayOfWeekDate = [calendar dateFromComponents:firstDayOfWeek]; 
     NSLog(@"first day = %@", firstDayOfWeekDate); 
    } 

И выход:

now = 2016-01-18 03:14:08 +0000 
first day = 2016-01-17 16:00:00 +0000 
now = 2016-01-18 03:14:08 +0000 
first day = 2016-01-17 17:01:01 +0000 

Почему час начинается с 16?

+0

Является ли ваш часовой пояс в UTC + 8? Если это так, ожидается выход. – rmaddy

+0

Да, это UTC + 8 – everettjf

ответ

1

NSDateComponents не делает этого 16:00:00. Это делает его полночь в вашем текущем часовом поясе. Но NSLog покажет вам эквивалентное время по Гринвичу. Это то, что означает +0000: например. GMT +00: 00.

Нижняя линия, если вы хотите увидеть результирующий объект NSDate в вашем местном часовом поясе, вы должны использовать NSDateFormatter.

1

Это связано с часовым поясом.

Попробуйте добавить NSDateFormatter, прежде чем вы выведете дату с помощью NSLog, например.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setLocale:[NSLocale currentLocale]]; 
[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterLongStyle]; 
NSString *dateDisplay = [dateFormatter stringFromDate:firstDayOfWeekDate]; 
NSLog(@"first day = %@",dateDisplay); 

Для получения дополнительной информации вы можете обратиться к this article.

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