2

識別子で使用しようとして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: 関数にあり、前後に他のコードは実行されていません。

また、月の日数を取得したい場合は、もう 1 日取得します。

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.

何が問題で、どうすれば修正できますか? ありがとうございました。

編集:

1 つの違いは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
4

4 に答える 4

4

datee = 1434-02-27 23:19:16 +0000多分これはイスラム暦の特徴でしょうか?イスラム教では、祈りの時間は日の出の方程式に関連しているため、特定の時点での太陽の時間を表現しようとする可能性があります. つまり、サウジアラビアでは、宗教上の理由から、太陽の時刻が唯一の有効な時刻です。彼らは一度も同じ土地を与えることを拒否します。太陽が最も高い位置にある場合、それは 12:00 です。これは、わずか数百キロ離れた都市では大きく異なるため、サウジアラビアの都市では時間が異なります。

他のイスラム教国では通常のタイムゾーンが使用されていますが、おそらくイスラム暦の最も有効な使用例は宗教行事の計算であるため、この実装は理にかなっていることに注意してください。太陽時間を使用すると、はるかに簡単になります。


このコードで

    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 は、デフォルトのタイムゾーンを考慮します。

于 2013-01-10T18:21:16.320 に答える
2

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).

これは、GMT とローカル ゾーンのタイム ゾーンの違いによるものです。

于 2013-01-10T13:51:11.613 に答える