在asp.net中收到阿拉伯语日期时间错误

时间:2014-11-12 13:57:34

标签: c# datetime calendar culture

我使用ADO断开连接模式通过填充数据集ds从数据库获取数据。 除日期字段

外,所有数据都成立
string strDate = ds.Tables[0].Rows[0]["H_DT"].ToString();

它抛出一个例外说:

  

此日历不支持指定的时间。它应该介于两者之间   04/30/1900 00:00:00(格里高利日)和11/16/2077 23:59:59   (格里高利日期),包括在内。

我试着写这段代码

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("ar-sa");
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar-sa");

将文化改为阿拉伯语,但没有任何运气。

更新

以下是变量快速监视的屏幕截图

enter image description here

4 个答案:

答案 0 :(得分:9)

来自DateTime.ToString method

  

ToString()方法返回日期的字符串表示形式   和当前文化使用的日历中的时间。如果值   当前DateTime实例早于   Calendar.MinSupportedDateTime或更晚。Calendar.MaxSupportedDateTime   ArgumentOutOfRangeException,该方法抛出一个   ar-sa

您的var culture = CultureInfo.GetCultureInfo("ar-sa"); Console.WriteLine(culture.Calendar); // prints UmAlQuraCalendar 种文化默认日历为UmAlQuraCalendar calender

DateTime

来自UmAlQuraCalendar.MinSupportedDateTime Property

  

UmAlQuraCalendar类支持的最早日期和时间,   这相当于 1900年4月30日C.E.的第一时刻   公历

由于您的1, 1, 1398ArgumentOutOfRangeException,因此抛出DateTime.ToString()太正常了。

您可以解决问题,在string strDate = ds.Tables[0].Rows[0]["H_DT"].ToString(CultureInfo.InvariantCulture); 方法中提供IFormatProvider参数默认情况下GregorianCalendar。例如,您可以使用InvariantCulture

ar-sa
  

我在网络配置中将全球化配置写为DateTime   所有应用程序中的全局但我遇到了同样的错误,请澄清   我,谢谢

默认情况下,DateTime属于公历 。来自DateTime structure;

  

每个IFormatProvider成员隐式使用公历执行   它的操作,除了指定一个的构造函数   日历和带有从System.Globalization.DateTimeFormatInfo派生的参数的方法,   例如ds.Tables[0].Rows[0]["H_DT"],这是隐含的   指定日历。

这意味着您的.ToString()日期时间默认为格里高利日历。但是,由于您使用CurrentCulture方法而没有任何参数,因此您的方法使用ar-sa UmAlQuraCalendar,因为您在web.config中编写了它。并且该文化默认具有DateTime日历。由于您的日期时间超出此日历范围,因此您的代码会抛出异常。

请记住,您在格里高利日历中有一年1318 1318作为一年,UmAlQuraCalendar日历中有 var date = new DateTime(1318, 1, 1); Console.WriteLine(date.ToString(new CultureInfo("ar-sa"))); 一年。

作为一个例子;

ArgumentOutOfRangeException

抛出1318异常,因为它与您的情况完全相同。这是日历时间,在格里高利日历中是UmAlQuraCalendar年,但此日期时间的UmAlQuraCalendar日历上没有任何代表,因为在1900日历中,年份以//////////////////////////////////////////////////////////////////////////// // // Notes about UmAlQuraCalendar // //////////////////////////////////////////////////////////////////////////// /* ** Calendar support range: ** Calendar Minimum Maximum ** ========== ========== ========== ** Gregorian 1900/04/30 2077/11/17 ** UmAlQura 1318/01/01 1500/12/30 */ 开头在格里高利日历中。

看一下UmAlQuraCalendar calender implemented;

的方式
{{1}}

答案 1 :(得分:0)

试试这个:

var ci = CultureInfo.CreateSpecificCulture("ar-SA");
string strDate = ds.Tables[0].Rows[0]["H_DT"].ToString(ci);

将日期转换为字符串时,您将传递所需的文化。

答案 2 :(得分:0)

--->此问题的原因

c#中DateTime对象中的hijri日期是在01/01/1318和30/12/1500之间。

格里高利日的

是在1900年到2077年之间

所以,如果我们打开sql数据库并获取日期并转换为hijri日期,我们注意到它不在上面的2 hijri日期之间

确保您可以通过在线打开任何转换器网站进行转换

<强> ----&GT;解决方案

您有2个解决方案来解决此问题

-solusion 1

您可以更新sql中的日期值

将其设置为实际日期(1900年至2077年之间)

-solution 2

在从数据表行获取日期之前,在代码中

,您应该将CurrentCulture设置为&#34; en &#34;当你完成代码时,你应该将语言设置为&#34; ar &#34;。

检查以下代码

bool isLanguageChanged = false;
if (Thread.CurrentThread.CurrentCulture.Name == "ar")
{
    isLanguageChanged = true;

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
}

string dateStr = dataTable.Rows[i]["DateColumn"].ToString();

if (isLanguageChanged)
{
    Thread.CurrentThread.CurrentCulture = new CultureInfo("ar");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar");
}

答案 3 :(得分:0)

在有限文化下将日期转换为字符串时使用InvariantCulture,如下所示:

using System.Globalization;
string str = someDate.ToString(CultureInfo.InvariantCulture);