将公历datestring转换为伊斯兰date会给出正确和不正确的结果

我有以下两个datestring:(1) 24/04/2013和(2) 19/03/2013我试图将这些date转换为伊斯兰(Um Al Qura)date,我使用此代码块这样做:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; df.dateFormat = @"dd/MM/yyyy"; df.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDate *dateInGrogrian = [df dateFromString:@"24/04/2013"]; NSDateFormatter *df2 = [[NSDateFormatter alloc] init]; NSCalendar * cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCalendar]; [df2 setCalendar:cal]; [df2 setDateFormat:@"dd/MM/yyyy"]; NSLog(@"Converted date to Islamic = %@",[df2 stringFromDate:dateInGrogrian]); 

如果input的string是24/04/2013 NSLog显示:

Converted date to Islamic = 14/06/1434这是正确的(根据所有伊斯兰国家使用的正式伊斯兰教历法 )。 但是如果inputstring是19/03/2013 NSLog显示:

Converted date to Islamic = 08/05/1434这是不正确的(根据伊斯兰教的日历,正确的date必须是07/05/1434,这是1天后)。

在提出答案之前要考虑的注意事项:

(1)我试图使用日历标识符NSIslamicCivilCalendar而不是NSIslamicCalendar ,但无济于事:其中一个转换date是正确的,另一个是错误的(1天后)。

(2)我试图使用GMT时区,如下所示: [df2 setTimeZone : [NSTimeZone timeZoneWithName:@"GMT"]]; ,这产生了正确的date(2)的转换date,但在date(1)(1天后)不正确。

(3)我尝试了解决scheme的组合: NSIslamicCivilCalendar有/无GMT时区, NSIslamicCalendar有/无GMT时区,但也无济于事…

任何人都可以提供一个满足两个date的代码块吗? 所以我确保任何提供的公历datestring被正确地转换成伊斯兰datestring。

非常感谢。

在打印出过去4年的所有date后,似乎苹果公司用math公式计算伊斯兰日历,因为正如Moxy所指出的那样,实际的日历并不是基于科学的日子,而是基于月球的近似值。

这个公式是:所有奇数个月有30天,偶数个月有29天,在任何年份中,上一个月增加了一个额外的一天,其中第30年的数字为下列之一: 10,13,16,18,21,24,26或29。

其结果是平均月份为29.53056天,与农历29.53059天相当接近。

这个公式已经在计算机的其他地方使用过,因为它是唯一的方法来计算date,而不用历史上每年的查找表。 除非您自己编写查找表,否则这将与所有date反复出现的date一样准确。

 // Create a Gregorian Calendar NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; // Set up components of a Gregorian date NSDateComponents *gregorianComponents = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; NSLog(@"[In Gregorian calendar ->] Day: %ld, Month: %ld, Year:%ld", (long)[gregorianComponents day], (long)[gregorianComponents month], (long)[gregorianComponents year]); gregorianComponents.day = [gregorianComponents day]; gregorianComponents.month = [gregorianComponents month]; gregorianComponents.year = [gregorianComponents year]; // Create the date NSDate *date = [gregorianCalendar dateFromComponents:gregorianComponents]; // Then create an Islamic calendar NSCalendar *hijriCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCivilCalendar]; // And grab those date components for the same date NSDateComponents *hijriComponents = [hijriCalendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:date]; NSLog(@"[In Hijri calendar ->] Day: %ld, Month: %ld, Year:%ld", (long)[hijriComponents day], (long)[hijriComponents month], (long)[hijriComponents year]);