2013-05-13 3 views
0

Почему это дает мне неправильную дату?Неправильная дата возвращается из NSDateComponents

NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; 
    NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]]; 
    [components setYear:2013]; 
    [components setMonth:06]; 
    [components setDay:28]; 
    [components setHour:5]; 
    [components setMinute:00]; 
    NSDate *startDate1 = [myCalendar dateFromComponents:components]; 
    NSLog(@"start date is %@",startDate1); 

Дата начала 2013-06-28 03:00:00 +0000

EDIT

То, что я хочу сделать, это следующее. У меня есть начало и конец.

Например:

Дата начала 2013-06-28 05:00

дата окончания: 2013-06-29 04:59

Тогда я хочу, чтобы проверить, если ток дата находится между датой начала и окончания. Я использую следующее.

NSComparisonResult result1 = [now compare:startDate1]; 
    NSComparisonResult result2 = [now compare:endDate1]; 

if (result2 == NSOrderedSame && result1 == NSOrderedSame) { 
     NSLOG(@"OKE!"); 
} 
+0

Ваше значение дата зависит от часового пояса. Измените его на локальный часовой пояс, чтобы решить вашу проблему. Настройки-Общие-Date & Time. – brianLikeApple

ответ

3

Вероятно, дата верна, но вы поняли журнал:

Logging дата всегда делается в TZ +0000. Например, если вы находитесь в центральной Европе, у вас будет (ожидается?) Дата 2013-06-28 05:00:00 +0200, но в журнале будет отображаться нормализованная дата 2013-06-28 03:00:00 +0000. Это же дата и время! Это просто выражается по-другому.

+++

Если компоненты находятся в TZ +0000, тоже, вы должны установить часовой пояс календаря.

0

Это потому, что вы должны распечатать дату с использованием часового пояса устройства, иначе это будет показано в формате UTC.

NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; 
    NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]]; 
    [components setYear:2013]; 
    [components setMonth:06]; 
    [components setDay:28]; 
    [components setHour:5]; 
    [components setMinute:00]; 
    NSDate *startDate1 = [myCalendar dateFromComponents:components]; 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    formatter.timeZone = [NSTimeZone systemTimeZone]; 
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; 
    NSLog(@"%@", [formatter stringFromDate:startDate1]); 
+0

Привет, я отредактировал свой вопрос немного подробнее. Думаю, я не могу сравнивать строки, как вы делаете? – Steaphann

1

Вы можете проверить, является ли текущая дата между двумя датами, как это:

NSDate *now = [NSDate date]; 
BOOL betweenStartAndEnd = ([startDate compare:now] == NSOrderedAscending && [endDate compare:now] == NSOrderedDescending); 

Ваш код действительно проверяет, является ли тестируемый дата EQUAL (NSOrderedSame) для обоих даты начала и окончания (что конечно же, не)

result2 == NSOrderedSame && result1 == NSOrderedSame 

Смотрите мой расширенный пример:

NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; 
NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]]; 
[components setYear:2013]; 
[components setMonth:05]; 
[components setDay:13]; 
[components setHour:18]; 
[components setMinute:00]; 
NSDate *startDate = [myCalendar dateFromComponents:components]; 
[components setDay:15]; 
NSDate *endDate = [myCalendar dateFromComponents:components]; 

NSDate *now = [NSDate date]; 
BOOL betweenStartAndEnd = ([startDate compare:now] == NSOrderedAscending && [endDate compare:now] == NSOrderedDescending); 

NSLog(@"Date %@ %@ between %@ and %@", now, betweenStartAndEnd ? @"IS" : @"IS NOT", startDate, endDate); 

Это выводит на консоль:

Date 2013-05-13 15:44:06 +0000 IS NOT between 2013-05-13 16:00:00 +0000 and 2013-05-15 16:00:00 +0000