Jalali / persian日期的验证错误

时间:2014-05-22 18:06:58

标签: c# datetime persian

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

我认为这个问题正在发生,因为考虑到这个日期的某种应用程序是英语,并且在英语日历中第2个月没有任何第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;
}

谢谢&的问候,

拉​​杰夫

3 个答案:

答案 0 :(得分:1)

因为在.NET框架中默认将persianCulture.Calendar设置为GregorianCalendar,并且在不使用反射的情况下无法更改为PersianCalendarmore info here

答案 1 :(得分:0)

使用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;
}

答案 2 :(得分:0)

我遇到了这个问题,但是我使用了这个并且它可以工作

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;
    }