Эйджри (исламская) проблема календаря!
-
08-10-2019 - |
Вопрос
Я бы преобразую Грегорианскую дату в Хиджри (исламскую) дату. После того, как искать в Интернете, я нашел исходный код для его преобразования. Я преобразовал код из Java и PHP до C Base.
Реализация несколько раз работает без проблем. Но некоторые дни есть проблемы.
Мне нужна ваша помощь либо исправить агрегат или доступный код, который будет работать без каких-либо проблем! Кстати, я нашел другой исходный код (http://emr.cs.iit.edu/~reingold/calendar.c) это основа C ++. Поскольку я не знаю C ++, если кто-то может преобразовать, что в C Base или цель C будет префекта (все же не уверен, что этот код будет работать правильно или нет).
PS Вы можете проверить правильную дату в: isamicfinder.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;
}
Решение
Предполагая, что это для приложения Mac (Cocoa) или iOS (Cocoa Touch), поскольку именно здесь вы видите объективные C чаще всего, вы можете просто сделать что-то подобное:
// 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];
Если все, что вы хотите, это текущая дата, то вы можете пропустить настройку Gregorian Date в целом и просто сделать это:
// 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];
Другие советы
Посмотрите на эту тему: Как конвертировать Hijari Date в Gregorian Date в Java Script?
Вопрос упоминает JavaScript, но главный ответ имеет ссылки на реализации в различных языках.
Вы должны быть в состоянии сделать это в Objective-C (если это действительно вариант), используя NSCalendar
.