2011-04-18 40 views
0

以下方法尝试计算给定希伯来语年的NSHebrew日历对象在一年中的天数。出于某种原因,我在各种设备上获得了不一致的结果。测试案例是1996年5月25日的日期。一台设备比另一台设备短一天,它的返回时间更长(正确的值)。为什么NSDate会跨设备不一致?

- (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小,但我不知道。会这样做吗?还有什么是公然不正确的吗?

+0

一些夏令时可能? – stefanB 2011-04-18 00:35:16

+0

检查设备时间和时区。 – 2011-04-18 00:54:05

+0

@HetalVora - 我检查了两者,我不认为*(我可能是错的),应该没有什么区别。在两种情况下,我都将日期和时间归一化为零。 – Moshe 2011-04-18 00:56:06

回答

0

这段代码的问题是我忽略了NSDateComponents的标识符。 NSDateComponents,没有必要的标识符,会扰乱小时,分钟和秒钟,从而在不同设备间产生不同的年份。

0

在我的测试版测试人员之间的设备之间有相同的观察。不同的蜂窝网络是指不同的时间信号傻,但他们用他们的时间进行计费,所以他们在蜂窝网络中提供他们自己的信号。

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

+0

对,但不是所有的运营商都有相同的*年*?另外,我手动设置我比较的日期对象上的时间。 – Moshe 2011-04-18 07:37:24

+0

这就是问题所在:应该。对于一些人来说,unix时间戳是一个神话,我遇到了具有不同的时间信号开始日期的移动提供商。最好的办法是检查/显示你到达那里。 – 2011-04-18 07:45:51

+0

你是说运营商使用希伯来语年? – Moshe 2011-04-18 07:46:57

相关问题