问题描述
我正在尝试将 NSCalendar 与 NSIslamicCalendar 标识符一起使用.但是当天结果不好,她是我的代码:
NSCalendar *calandar = [[NSCalendar alloc]initWithCalendarIdentifier:NSIslamicCalendar]; NSDateComponents *components = [calandar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:[NSDate date]]; NSInteger theDay = [components day]; NSInteger theMonth = [components month]; NSInteger theYear = [components year]; [components setDay:theDay]; [components setMonth:theMonth]; [components setYear:theYear]; NSDate *thisDate = [calandar dateFromComponents:components]; NSLog(@"year=%i month=%i day=%i",theYear,theMonth,theDay); NSLog(@"thisdate = %@", [thisDate description]); NSString *strDate = [NSString stringWithFormat:@"%i-%i-%i",theYear,theMonth,theDay]; NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; [formatter setDateFormat:@"yyyy-MM-dd"]; NSDate *datee = [formatter dateFromString:strDate]; NSLog(@"datee = %@", [datee description]);
日志:
year=1434 month=2 day=28 ----> all good (it's islamic calandar) thisdate = 2013-01-09 23:00:00 +0000 ----> not good (we are in 2013-01-10 not 09). datee = 1434-02-27 23:19:16 +0000 ----> not good (we are in 1434-02-28 not 27)
如您所见,第一个日期是正确的而不是其他 2 个,而且时间也不正确(当我编译时大约是 14:20),并且在最后 2 个最后一个日志之间有所不同(23:00:00 与 23:19:16).
此代码在我的 viewDidload: 函数中,之前或之后没有其他代码在运行.
另外,如果我想得到一个月的天数,我会再得到一天:
NSCalendar *c = [[NSCalendar alloc]initWithCalendarIdentifier:NSIslamicCalendar]; NSRange dayRange = [c rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date]; NSLog(@"dayRange.length = %i",dayRange.length);
日志:
dayRange.length = 30 -----> but this islamic month have 29 day not 30.
有什么问题,我该如何解决?谢谢.
编辑:
NSGregorianCalendar 似乎是一样的,其中一个区别是天数是正确的.使用 NSGregorianCalendar
记录year=2013 month=1 day=10 -----> all good thisdate = 2013-01-09 23:00:00 +0000 -----> not good datee = 2013-01-09 23:00:00 +0000 -----> not good dayRange.length = 31 ------------------------> all good
推荐答案
datee = 1434-02-27 23:19:16 +0000 也许这是伊斯兰历法的特色?在伊斯兰教中,祈祷的时间与日出方程式有关,它可以尝试在某个点上表达太阳时间.IE.在沙特阿拉伯,出于宗教原因,太阳时间是唯一有效的时间.他们拒绝给同一块土地一次.如果太阳处于最高点,则为 12:00.由于这在相距仅几百公里的城市中差异很大,因此沙特阿拉伯的城市有不同的时间.
请注意,尽管在任何其他伊斯兰国家都使用正常时区,但这种实现是有意义的,因为伊斯兰日历最有效的用例可能是计算宗教事件 - 如果我使用 Sun,它会变得容易得多时间.
<小时>使用此代码
NSCalendar *islamicCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCalendar]; NSDate *today = [NSDate date]; [islamicCalendar rangeOfUnit:NSDayCalendarUnit startDate:&today interval:NULL forDate:today]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setCalendar:islamicCalendar]; [dateFormatter setTimeStyle:NSDateFormatterFullStyle]; [dateFormatter setDateStyle:NSDateFormatterFullStyle]; //english output dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; NSString * islamicDateString = [dateFormatter stringFromDate:today]; NSLog(@"%@", islamicDateString);
结果
2013-01-11 01:13:46.110 islamicCalendarTest[18346:303] Friday, Safar 29, 1434 12:00:00 AM Central European Standard Time
NSDateFormatter 会考虑您的默认时区.