Как конвертировать из персидской даты в григорианскую дату в Android
Я использую PersianDatePicker, чтобы выбрать дату. Это прекрасно работает, но я хочу преобразовать выбранную персидскую дату в григорианскую дату.
Я нашел код и пример из интернета, но расчет неверен. Когда я выбираю текущую дату на персидском 5.7.1396 и конвертирую ее в григорианскую, я получаю 4.8.2017.
public static int g_days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30,
31, 30, 31 };
public static int j_days_in_month[] = { 31, 31, 31, 31, 31, 31, 30, 30, 30,
30, 30, 29 };
/**
* Converts Persian date to gregorian date
* */
public static Calendar getGregorianCalendar(int year, int month, int day) {
int gy, gm, gd;
int jy, jm, jd;
long g_day_no, j_day_no;
boolean leap;
int i;
jy = year - 979;
jm = month - 1;
jd = day - 1;
j_day_no = 365 * jy + (jy / 33) * 8 + (jy % 33 + 3) / 4;
for (i = 0; i < jm; ++i)
j_day_no += j_days_in_month[i];
j_day_no += jd;
g_day_no = j_day_no + 79;
gy = (int) (1600 + 400 * (g_day_no / 146097)); /*
* 146097 = 365*400 +
* 400/4 - 400/100 +
* 400/400
*/
g_day_no = g_day_no % 146097;
leap = true;
if (g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */
{
g_day_no--;
gy += 100 * (g_day_no / 36524); /* 36524 = 365*100 + 100/4 - 100/100 */
g_day_no = g_day_no % 36524;
if (g_day_no >= 365)
g_day_no++;
else
leap = false;
}
gy += 4 * (g_day_no / 1461); /* 1461 = 365*4 + 4/4 */
g_day_no %= 1461;
if (g_day_no >= 366) {
leap = false;
g_day_no--;
gy += g_day_no / 365;
g_day_no = g_day_no % 365;
}
for (i = 0; g_day_no >= g_days_in_month[i]
+ parsBooleanToInt(i == 1 && leap); i++)
g_day_no -= g_days_in_month[i] + parsBooleanToInt(i == 1 && leap);
gm = i + 1;
gd = (int) (g_day_no + 1);
GregorianCalendar gregorian = new GregorianCalendar(gy, gm - 1, gd);
return gregorian;
}
private static int parsBooleanToInt(Boolean sample) {
if (sample)
return 1;
else
return 0;
}
1 ответ
Используйте библиотеку PersianCaldroid в качестве DatePicker, которая также предоставит вам API, необходимые для преобразования дат. Вот как вы можете конвертировать персидскую дату в григорианскую дату:
CivilDate civilDate = DateConverter.persianToCivil(new PersianDate());
Log.e("Gregorian Date", civilDate.toString());
Gregorian Date: 2018/05/19
Я использовал эту библиотеку для преобразования даты Джалали в григорианскую дату и наоборот:
https://github.com/samanzamani/PersianDate
Вы можете использовать toGregorian(int year, int month, int day)
метод от него.