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]);
如果输入字符串是24/04/2013,NSLog显示:
转换为伊斯兰= 14/06/1434这是正确的(根据所有伊斯兰国家使用的the formal Islamic calendar).但如果输入字符串是19/03/2013,NSLog显示:
转换日期为伊斯兰= 08/05/1434这是不正确的(根据伊斯兰教日历正确的日期必须是07/05/1434这是1天后).
在您提出答案之前要考虑:
(1)我尝试使用日历标识符NSIslamicCivilCalendar而不是NSIslamicCalendar,但无效:其中一个转换日期是正确的,另一个错误(1天后).
(2)我试图使用GMT时区,如下所示:[df2 setTimeZone:[NSTimeZone timeZoneWithName:@“GMT”]];,这产生了第(2)天的正确转换日期,但第(1)天(1天后)不正确.
(3)我已经尝试了解决方案的组合:NSIslamicCivilCalendar有/没有GMT时区,NSIslamicCalendar有/没有GMT时区,但也没有用…
任何人都可以提供满足这两个日期的代码块?所以我确保任何提供的gregorian日期字符串被正确地转换成伊斯兰日期字符串.
非常感谢.
解决方法
这个公式是,所有奇数月份都有30天,所有偶数月份有29天,在任何一年的最后一个月增加了一个额外的日子,其中年份30是以下之一:2,5,7,10,13,16,18,21,24,26或29.
结果是平均月长29.53056天,与农历29.53059天相当接近.
这个公式已经在计算机的其他地方使用,因为它是计算日期的唯一方法,而不使用历史记录中每年的查找表.因此,除非您自己编写查找表,否则这将与您可以获得的所有日期向前和向后一样准确.