我正在使用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;
}
谢谢&的问候,
拉杰夫
答案 0 :(得分:1)
因为在.NET框架中默认将persianCulture.Calendar
设置为GregorianCalendar
,并且在不使用反射的情况下无法更改为PersianCalendar
。 more 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;
}