Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android中从波斯日期转换为公历日期_Java_Android_Gregorian Calendar_Persian Calendar - Fatal编程技术网

Java 如何在android中从波斯日期转换为公历日期

Java 如何在android中从波斯日期转换为公历日期,java,android,gregorian-calendar,persian-calendar,Java,Android,Gregorian Calendar,Persian Calendar,我使用PersianDatePicker来选择日期。这很好,但我想将选定的波斯日期转换为公历日期 我从网上找到了一些代码和示例,但计算不正确。当我在波斯语5.7.1396中选择当前日期并将该日期转换为公历时,我得到2017年8月4日 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[]

我使用PersianDatePicker来选择日期。这很好,但我想将选定的波斯日期转换为公历日期

我从网上找到了一些代码和示例,但计算不正确。当我在波斯语5.7.1396中选择当前日期并将该日期转换为公历时,我得到2017年8月4日

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;
}
使用库作为日期选择器,它将为您提供转换日期所需的API。以下是如何将波斯日期转换为公历日期:

CivilDate civilDate = DateConverter.persianToCivil(new PersianDate());
Log.e("Gregorian Date", civilDate.toString());

Gregorian Date: 2018/05/19

我使用此库将Jalali日期转换为公历日期,反之亦然:


您可以从中使用toGregorianint year、int month、int day方法。

很难说您的算法哪里出错。重新设计日历通常很难。使用我的lib Time4A可以得到您所需要的:`System.out.printlnPersianCalendar.of1396,7,5.transformPlainDate.class;`//2017年9月27日该库在某些手机型号上存在一些问题,例如A30,强烈建议不要使用它。有更好的库吗@seyedrezafaruse this com.github.dariushm2:PersianCaldroid:1.0.1取而代之的是,它有一个DateConverter,可以很好地完成这项工作,我现在就转到这个,还没有错误@萨德格·甘巴里