Получить неправильный NSDate из NSDateComponent с 2011-01-01 - PullRequest
0 голосов
/ 09 марта 2011

Я получаю какой-то странный результат от NSDateComponents и NSDateFormatter.

У меня есть следующий метод для установки часа на 10 утра для данной даты

+ (NSDate *)getTenOClockOnDate:(NSDate*)inputDate
{

NSCalendar *cal = [NSCalendar autoupdatingCurrentCalendar];

NSDateComponents *components = [cal components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit ) fromDate:inputDate];

[components setHour:10];
[components setMinute:0];
[components setSecond:0];

// construct new date and return
NSDate *newDate = [cal dateFromComponents:components];

NSLog(@"input date: %@ -- new date: %@", inputDate, newDate);

return newDate;
}

В то время как я делаю следующий вызов:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];    
[MyUtils getTenOClockOnDate:[dateFormatter dateFromString:@"2010-12-31"]];
[MyUtils getTenOClockOnDate:[dateFormatter dateFromString:@"2011-01-01"]];
[MyUtils getTenOClockOnDate:[dateFormatter dateFromString:@"2011-01-02"]];

только во второй строке, я получаю неожиданный результат:

input date: 2010-12-31 05:00:00 GMT -- new date: 2010-12-31 15:00:00 GMT
input date: 2011-01-01 05:00:00 GMT -- new date: 2011-12-31 15:00:00 GMT
input date: 2011-01-02 05:00:00 GMT -- new date: 2011-01-02 15:00:00 GMT

Проблема на второй записи, 2011-01-01, она превращается в 2011-12-31, просто установив час на 10.

Ответы [ 3 ]

1 голос
/ 13 апреля 2015

Println(date) в Swift неверно, используйте nsdateformatter с stringfromdate

Я думаю, это применимо и к nslog, в Objective-C

0 голосов
/ 03 мая 2011

Это даст правильное значение NSDate из NSDateComponents,

NSDateFormatter* df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"yyyy-MM-dd"];
NSDate* date = [df dateFromString:@"2011-01-01"];
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:date];
NSInteger day = [components day];    
NSInteger month = [components month];
NSInteger year = [components year];
[df release];

NSLog(@"Day : %d, Month : %d, Year : %d",day,month,year);

Это может вам помочь.

0 голосов
/ 09 марта 2011

Это действительно выглядит довольно странно ... Хотя ваш код выглядит так, как будто все должно быть хорошо, я догадываюсь, что это произойдет, когда вы инициализируете объект NSDateComponents, вы не включаете NSHourCalendarUnit и NSMinuteCalendarUnit.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...