0

下面的方法尝试计算 NSHebrew 日历对象在一年中的天数,给定一个希伯来年份。出于某种原因,我在不同设备上得到的结果不一致。测试用例是 1996 年 5 月 25 日的日期。一台设备的返回时间比另一台设备长一天(正确值),后者短了一天。

- (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并且更小,但我不确定。会这样做吗?还有什么明显不正确的吗?

4

2 回答 2

0

这段代码的问题在于我遗漏了 NSDateComponents 的标识符。NSDateComponents 没有必需的标识符,会弄乱小时、分钟和秒,从而在设备上产生不同的年份长度。

于 2011-04-28T06:01:48.740 回答
0

在我的 beta 测试人员的设备之间有相同的观察结果。不同的蜂窝网络意味着不同的时间信号。很傻,但是他们用时间来计费,所以他们在蜂窝网络中提供自己的信号。

iPod 由主机设置,主机通常由 NTP 服务器设置。这些应该很同步。

于 2011-04-18T07:16:29.797 回答