贾拉利语/波斯语日期验证错误

本文关键字:验证 错误 日期 波斯语 贾拉利 | 更新日期: 2023-09-27 18:04:51

我正在使用c#开发阿拉伯语/达里语/普什图语(阿富汗)的应用程序,并使用贾拉利/波斯日历进行日期选择。我想在保存到数据库之前验证输入日期。我使用下面的函数进行验证,并将Jalali/波斯日历日期传递给此函数。当用户选择"28/02/1393"这样的日期时,它可以完美地工作,但对于日期"31/02/1393",它会抛出错误。这两个日期都是有效的贾拉利/波斯日期。

我认为这个问题发生了,因为不知何故应用程序考虑到这个日期是英语的,在英语日历的第二个月没有任何31天。请帮我找到解决方案。

static public bool ValidateParsianDate(string date)
{
    bool status = true;
    try
    {
        PersianCalendar persianCalendar = new PersianCalendar();
        CultureInfo persianCulture = new CultureInfo("fa-IR");
        DateTime persianDateTime = DateTime.ParseExact(date, "dd/MM/yyyy", persianCulture);
    }
    catch (Exception ex)
    {
        string msg = ex.Message;
        status = false;
    }
    return status;
}

谢谢,认为,

Rajeev

贾拉利语/波斯语日期验证错误

使用PersianCalendar.ToDateTime( int year, int month, int day, int hour, int minute, int second, int millisecond, int era )方法

static public bool ValidateParsianDate(string date)
{
    bool status = true;
    try
    {
        PersianCalendar persianCalendar = new PersianCalendar();
        var dateParts = date.Split(new char[] { '/' }).Select(d=> int.Parse(d)).ToArray();
        var date = persianCalendar.ToDateTime(dateParts[2], dateParts[1], dateParts[0], 0, 0,0,0, /*8 era of year here **/);
 }
    catch (Exception ex)
    {
        string msg = ex.Message;
        status = false;
    }
    return status;
}

因为persianCulture.Calendar在。net框架中默认设置为GregorianCalendar,不使用反射不能更改为PersianCalendar。更多信息在这里

我有这个问题,但我使用这个,它的工作

public static bool IsValidDate(string date)
    {
        var regex = new Regex("^''d{ 4 } /''d{ 2}/''d{ 2}$");
        var arrPattern = new[] {
            new Regex("^''d{4}/''d{2}/''d{2}$"),
            new Regex("^''d{ 4 } /''d{ 2}/''d{ 1}$"),
            new Regex("^''d{ 4 } /''d{ 1}/''d{ 2}$"),
            new Regex("^''d{ 4 } /''d{ 1}/''d{ 1}$"),
            new Regex("^''d{ 2 } /''d{ 2}/''d{ 2}$"),
            new Regex("^''d{ 2 } /''d{ 2}/''d{ 1}$"),
            new Regex("^''d{ 2 } /''d{ 1}/''d{ 2}$"),
            new Regex("^''d{ 2 } /''d{ 1}/''d{ 1}")
        };
        const int kabise = 1387;
        var year = 0;
        var mounth = 0;
        var day = 0; var flag = false;
        foreach (var t in arrPattern)
        {
            if (t.IsMatch(date))
                flag = true;
        }
        if (flag == false) return flag;
        //جدا کننده تاریخ می تواند یکی از این کاراکترها باشد
        var splitDate = date.Split('/','-',':');
        year = Convert.ToInt32(splitDate[0]);
        mounth = Convert.ToInt32(splitDate[1]);
        day = Convert.ToInt32(splitDate[2]);
        if (mounth > 12 || mounth <= 0)
            flag = false;
        else
        {
            if (mounth< 7)
            {
                if (day > 31)
                {
                    flag = false;
                }
            }
            if (mounth != 12) return flag;
            var t = (year - kabise) % 4;
            if ((year - kabise) % 4 == 0)
            {
                if (day >= 31)
                    flag = false;
            }
            else if (day >= 30)
                flag = false;
        }
        return flag;
    }