Question

Je convertir date grégorienne à ce jour Hijri (Islamique). Après peut effectuer une recherche sur le web, j'ai trouvé un code source pour le convertir. Je me suis converti le code de Java et PHP à la base C.

La mise en œuvre des temps de travail sans aucun problème. Mais quelques jours a un problème.

J'ai besoin de votre aide soit fixer l'outil ou un code disponible qui fonctionnera sans aucun problème! BTW j'ai trouvé un autre code source ( http://emr.cs.iit.edu/~ Reingold / calendar.C) qui est la base de C. Comme je ne sais pas C ++ si quelqu'un peut le convertir en C base ou de l'objectif C serait préfet (toujours pas sûr que ce code ne fonctionne pas correctement ou).

P.S. Vous pouvez vérifier la date correcte: islamicfinder.org/Hcal/index.php

void gregorian_to_hijri(int* h_y, int* h_m, int* h_d, int  g_y, int  g_m, int  g_d)
{
    int year, month, day;

    int zyr;
    int zd;
    int zm;
    int zy;

    float zjd;
    int zl;
    int zn;
    int zj;

    year = g_y;
    month = g_m;
    day = g_d;


    zyr = year;
    zd = day;
    zm = month;
    zy = zyr;

    if((zy > 1582) || ((zy == 1582) && (zm > 10)) || ((zy == 1582) && (zm == 10) && (zd > 14)))
    {
        zjd = ((1461 * (zy + 4800 + ((zm - 14) / 12))) / 4)
            + ((367 * (zm - 2 - 12 * (((zm - 14) / 12)))) / 12)
            - ((3 * (((zy + 4900 + ((zm - 14) / 12)) / 100))) / 4) + zd - 32075;
    }
    else
    {
        zjd = 367 * zy - ((7 * (zy + 5001 + ((zm - 9) / 7))) / 4)
            + ((275 * zm) / 9) + zd + 1729777;
    }

    zl = zjd - 1948440 + 10632;
    zn = ((zl - 1) / 10631);
    zl = zl - 10631 * zn + 354;
    zj = (((10985 - zl) / 5316)) * ((int)((50 * zl) / 17719))
        + ((zl / 5670)) * ((int)((43 * zl) / 15238));

    zl = zl - (((30 - zj) / 15)) * (((17719 * zj) / 50))
        - ((zj / 16)) * (((15238 * zj) / 43)) + 29;

    zm = ((24 * zl) / 709);
    zd = zl - ((709 * zm) / 24);
    zy = 30 * zn + zj - 30;

    *h_y = zy;
    *h_m = zm;
    *h_d = zd;
}
Était-ce utile?

La solution

En supposant que ce soit pour un Mac (Cocoa) ou iOS app (Cocoa Touch), puisque c'est là que vous voyez le plus souvent Objective C, vous pouvez alors juste faire quelque chose comme ceci:

// Create a Gregorian Calendar
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

// Set up components of a Gregorian date
NSDateComponents *gregorianComponents = [[NSDateComponents alloc] init];

gregorianComponents.day = 4;
gregorianComponents.month = 12;
gregorianComponents.year = 2010;

// Create the date
NSDate *date = [gregorianCalendar dateFromComponents:gregorianComponents];

[gregorianComponents release];
[gregorianCalendar release];


// 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", 
          [hijriComponents day],
          [hijriComponents month],
          [hijriComponents year]);

[hijriCalendar release];

Si vous voulez tout est la date actuelle, vous pouvez sauter la mise en place de la date grégorienne tout à fait et faites ceci:

// Create an Islamic calendar
NSCalendar *hijriCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCalendar];

// And grab the date components for the current date
NSDateComponents *hijriComponents = [hijriCalendar components:(NSDayCalendarUnit | 
                                                               NSMonthCalendarUnit |
                                                               NSYearCalendarUnit)
                                                     fromDate:[NSDate date]];

[hijriCalendar release];

Autres conseils

Jetez un oeil à ce sujet: comment convertir la date hijari en date Grégorienne en script java?

La question JavaScript mentionne mais la réponse haut semble avoir des liens vers des mises en œuvre dans une variété de langues.

Vous devriez être en mesure de le faire en Objective-C (si cela est vraiment une option) en utilisant NSCalendar.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top