Почему NSDate может быть несовместимым на разных устройствах? - PullRequest
0 голосов
/ 18 апреля 2011

Следующий метод пытается вычислить количество дней в году объекта календаря NSHebrew, учитывая год иврита. По некоторым причинам я получаю противоречивые результаты на разных устройствах. Тестовый случай был датой 25 мая 1996 года. Одно устройство возвращало на один день дольше (правильное значение), чем другое устройство, которое было на один день меньше.

- (NSInteger) lengthOfYearForYear:(NSInteger)year{

//
//  Then get the first day of the current hebrew year
//

NSCalendar *hebrewCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSHebrewCalendar];

NSDateComponents *roshHashanaComponents = [[[NSDateComponents alloc] init ]autorelease];

[roshHashanaComponents setDay:1];
[roshHashanaComponents setMonth:1];
[roshHashanaComponents setYear:year];
[roshHashanaComponents setHour:12];
[roshHashanaComponents setMinute:0];
[roshHashanaComponents setSecond:0];

NSDate *roshHashanaDate = [hebrewCalendar dateFromComponents:roshHashanaComponents];

//
//  Then convert that to gregorian
//

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *gregorianDayComponentsForRoshHashana = [gregorianCalendar components:NSWeekdayCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:roshHashanaDate];

//Determine the day of the week of the first day of the current hebrew year

NSDate *oneTishreiAsGregorian = [gregorianCalendar dateFromComponents:gregorianDayComponentsForRoshHashana];

//
//  Then get the first day of the next hebrew year
//

NSDateComponents *roshHashanaOfNextYearComponents = [[NSDateComponents alloc] init ];

NSInteger tempYear = year+1;

[roshHashanaOfNextYearComponents setDay:1];
[roshHashanaOfNextYearComponents setMonth:1];
[roshHashanaOfNextYearComponents setYear:tempYear];
[roshHashanaOfNextYearComponents setHour:12];
[roshHashanaOfNextYearComponents setMinute:0];
[roshHashanaOfNextYearComponents setSecond:0];

NSDate *roshHashanaOfNextYearAsDate = [hebrewCalendar dateFromComponents:roshHashanaOfNextYearComponents];

[roshHashanaOfNextYearComponents release];

[hebrewCalendar release];

//
//  Then convert that to gregorian
//

NSDateComponents *gregorianDayComponentsForRoshHashanaOfNextYear = [gregorianCalendar components:NSWeekdayCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:roshHashanaOfNextYearAsDate];

//Determine the first day of the week of the next hebrew year
NSDate *oneTishreiOfNextYearAsGregorian = [gregorianCalendar dateFromComponents:gregorianDayComponentsForRoshHashanaOfNextYear];

//  Length of this year in days 
NSTimeInterval totalDaysInTheYear = [oneTishreiOfNextYearAsGregorian timeIntervalSinceReferenceDate] - [oneTishreiAsGregorian timeIntervalSinceReferenceDate];

//
//   We round here because of slight offsets in the Gregorian calendar.
//

totalDaysInTheYear = round(totalDaysInTheYear/86400);

if(totalDaysInTheYear == 353 || totalDaysInTheYear == 383){
    totalDaysInTheYear = 0;
}else if(totalDaysInTheYear == 354 || totalDaysInTheYear == 384){
    totalDaysInTheYear = 1;
}else if(totalDaysInTheYear == 355 || totalDaysInTheYear == 385){
    totalDaysInTheYear = 2;
}

return totalDaysInTheYear;

}

Я думаю , что это может быть потому, что я не использую NSHourCalendarUnit и меньше, но я не уверен. Будет ли это сделать? Есть что-нибудь еще, что явно неверно?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2011

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

0 голосов
/ 18 апреля 2011

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

iPod устанавливаются хост-машинами, которые обычно устанавливаются NTP-сервером. Они должны быть синхронизированы.

...