17

次の 2 つの日付文字列があります: (1) 24/04/2013および (2) 19/03/2013これらの日付をイスラム (Um Al Qura) の日付に変換しようとしています。このコード ブロックを使用してそうする:

    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表示されます。

Converted date to Islamic = 14/06/1434これは正しいです (すべてのイスラム諸国で使用されている正式なイスラム暦によると)。しかし、入力文字列が 2013 年 3 月 19 日の場合、次のようにNSLog表示されます。

Converted date to Islamic = 08/05/1434これは正しくありません (イスラム暦によると、正しい日付は 1434 年 7 月 5 日であり、1 日遅れています)。

-回答を提案する前に考慮すべき注意事項:

(1)NSIslamicCivilCalendarの代わりにカレンダー識別子を使用しようとしましたNSIslamicCalendarが、役に立ちませんでした: 変換された日付の 1 つが正しく、もう 1 つが間違っていました (1 日遅れ)。

(2)次のように GMT タイム ゾーンを使用しようとしました: [df2 setTimeZone : [NSTimeZone timeZoneWithName:@"GMT"]];、これにより、(2) 日については正しい変換日付が生成されましたが、(1) 日については正しくありません (1 日遅れ)。

(3)解決策の組み合わせを試しました:NSIslamicCivilCalendarGMTタイムゾーンありNSIslamicCalendar/なし、GMTタイムゾーンあり/なし、でも役に立たなかった...

両方の日付を満たすコードブロックを提供できる人はいますか? そのため、提供されたグレゴリオ暦の日付文字列がイスラムの日付文字列に正しく変換されるようにします。

どうもありがとうございます。

4

2 に答える 2

8
// 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]);
于 2013-06-18T06:22:25.253 に答える