首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSCalendar数据误差

NSCalendar数据误差
EN

Stack Overflow用户
提问于 2013-01-10 13:47:24
回答 4查看 1.3K关注 0票数 2

我正在尝试将NSCalendarNSIslamicCalendar标识符结合使用。但是今天的结果不是很好,她是我的准则:

代码语言:javascript
运行
复制
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]);

日志:

代码语言:javascript
运行
复制
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)

正如您所看到的,第一个日期是正确的,而不是其他的日期,而且时间也不正确(当我编译它是14:20时),并且它在最后两个日志(23:00:00 vs 23:19:16)之间有所不同。

此代码位于我的viewDidload: function中,其他代码在此之前或之后都不会运行。

另外,如果我想要一个月的天数,我还有一天:

代码语言:javascript
运行
复制
NSCalendar *c = [[NSCalendar alloc]initWithCalendarIdentifier:NSIslamicCalendar];
NSRange dayRange = [c rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date];
NSLog(@"dayRange.length = %i",dayRange.length);

日志:

代码语言:javascript
运行
复制
dayRange.length = 30 -----> but this islamic month have 29 day not 30.

有什么问题,我怎么解决呢?谢谢。

编辑:

对于NSGregorianCalendar来说,似乎是一样的,有一个不同之处是,天数是正确的。使用NSGregorianCalendar记录日志

代码语言:javascript
运行
复制
 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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-10 18:21:16

datee = 1434-02-27 23:19:16 +0000,也许这是伊斯兰历法的特色菜?在伊斯兰教中,祈祷的时间与日出方程有关,它可以在某一点上表达太阳的时间。例如,在沙特阿拉伯,由于宗教原因,太阳时间是唯一有效的时间。他们拒绝给同样的土地一次。如果太阳在最高点,那就是12:00。由于这在相距几百公里的城市有很大的不同,沙特阿拉伯的城市有不同的时代。

请注意,尽管在任何其他伊斯兰国家都使用正常时区,但这种实现是有意义的,因为伊斯兰日历最有效的用例可能是计算宗教事件--如果我使用Sun time,就会变得容易得多。

用这个代码

代码语言:javascript
运行
复制
    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);

其结果是

代码语言:javascript
运行
复制
2013-01-11 01:13:46.110 islamicCalendarTest[18346:303] Friday, Safar 29, 1434 12:00:00 AM Central European Standard Time

NSDateFormatter考虑到您的默认时区。

票数 4
EN

Stack Overflow用户

发布于 2013-01-10 13:51:11

time is not correct (when i compile it's about 14:20) and it differs between the last 2 last log (23:00:00 vs 23:19:16).

这是因为格林尼治时间和当地地区之间的时区差异。

票数 2
EN

Stack Overflow用户

发布于 2013-06-18 06:18:45

代码语言:javascript
运行
复制
// 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]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14259397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档