C# 在asp.net中接收阿拉伯语日期时间错误
我使用ADO断开连接模式通过填充数据集ds从数据库中获取数据。 除日期字段外,所有数据均为真C# 在asp.net中接收阿拉伯语日期时间错误,c#,datetime,calendar,culture,C#,Datetime,Calendar,Culture,我使用ADO断开连接模式通过填充数据集ds从数据库中获取数据。 除日期字段外,所有数据均为真 string strDate = ds.Tables[0].Rows[0]["H_DT"].ToString(); 它抛出一个异常,表示: 此日历不支持指定的时间。应该是在 1900年4月30日00:00:00(公历日期)和2077年11月16日23:59:59 (公历日期),包括在内 我试着写这段代码 System.Threading.Thread.CurrentThread.CurrentCult
string strDate = ds.Tables[0].Rows[0]["H_DT"].ToString();
它抛出一个异常,表示:
此日历不支持指定的时间。应该是在
1900年4月30日00:00:00(公历日期)和2077年11月16日23:59:59
(公历日期),包括在内
我试着写这段代码
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("ar-sa");
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar-sa");
将文化改为阿拉伯语,但没有任何运气
更新
以下是该变量的快速观察屏幕截图
试试这个:
var ci = CultureInfo.CreateSpecificCulture("ar-SA");
string strDate = ds.Tables[0].Rows[0]["H_DT"].ToString(ci);
将日期转换为字符串时,您将传递所需的区域性。From
ToString()
方法返回日期的字符串表示形式
以及当前区域性使用的日历中的时间。如果
当前DateTime
实例早于
Calendar.MinSupportedDateTime
或晚于
Calendar.MaxSupportedDateTime
,该方法抛出
ArgumentOutOfRangeException
您的ar sa
区域性的默认日历为
来自
UmAlQuraCalendar类支持的最早日期和时间,
这相当于公元1900年4月30日在
公历
由于您的DateTime
是11998
,因此抛出ArgumentOutOfRangeException
太正常了
您可以在DateTime.ToString()
方法中提供一个参数来解决问题,默认情况下该方法具有。例如,您可以使用
string strDate = ds.Tables[0].Rows[0]["H_DT"].ToString(CultureInfo.InvariantCulture);
我在web配置中将全球化配置写成arsa
tobe
所有应用程序都是全局的,但我遇到了相同的错误,请澄清
我,谢谢
默认情况下,DateTime
属于公历。来自
每个DateTime
成员都隐式地使用公历来执行
它的操作,除了指定
日历,以及带有从IFormatProvider
派生的参数的方法,
例如System.Globalization.DateTimeFormatInfo
,隐式地
指定日历
这意味着您的ds.Tables[0]。行[0][“H_DT”]
datetime默认为公历。但是由于您使用的.ToString()
方法没有任何参数,因此您的方法使用的是CurrentCulture
,即ar sa
,因为您在web.config中编写了它。默认情况下,该区域性具有UmAlQuraCalendar
日历。由于您的datetime超出此日历的范围,您的代码将引发异常
请记住,您有一个DateTime
,其中1318
作为格里高利日历中的一年,而不是1318
作为UmAlQuraCalendar
日历中的一年
例如,
var date = new DateTime(1318, 1, 1);
Console.WriteLine(date.ToString(new CultureInfo("ar-sa")));
抛出ArgumentOutOfRangeException
异常,因为它与您的情况完全相同。这是一个日期时间,在公历中为1318
年,但在UmAlQuraCalendar
日历上没有此日期时间的表示,因为在UmAlQuraCalendar
日历中,年份从公历中的1900
开始
看看是怎么回事
-->此问题的原因
c#中DateTime对象中的hijri的日期介于1318年1月1日和1500年12月30日之间
在公历中,日期介于1900年和2077年之间
因此,如果我们打开sql数据库并获取日期并转换为hijri日期,我们会注意到它不在上述两个hijri日期之间
通过在线打开任何转换器网站来确保您可以转换它
--->解决方案 您有两个解决此问题的解决方案 -solusion 1 可以在sql中更新日期的值 将其设置为实际日期(1900到2077之间) 或 -解决方案2 在从datatable行获取日期之前,应在代码中将CurrentCulture设置为“en”,完成代码后,应将语言设置为“ar” 检查下面的代码
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");
}
将日期转换为有限区域性下的字符串时,请使用
InvariantCulture
,如下所示:
using System.Globalization;
string str = someDate.ToString(CultureInfo.InvariantCulture);
ds.Tables[0].Rows[0][“H_DT”]
的值到底是多少?调试您的代码并告诉我们。Soner,我用screenshotexapnd date节点编辑了我的问题,也在您的屏幕快照中。非常感谢Soner,您的伟大解决方案已经解决了这个问题,请让我理解您所说的“ToString()方法返回当前区域性使用的日历中日期和时间的字符串表示形式。如果当前DateTime实例的值早于calendar.MinSupportedDateTime或晚于calendar.MaxSupportedDateTime,则该方法将抛出ArgumentOutOfRangeException“我在web配置中编写了全球化配置,因为ar sa在所有应用程序中都是全局的,但我遇到了相同的错误,请澄清我的错误,谢谢这一部分“UmAlQuraCalendar类支持的最早日期和时间,相当于公历中公元1900年4月30日的第一个时刻。因为您的日期时间是1,1,1398,所以抛出ArgumentOutOfRangeException“日期1/1/1398”是太正常了。仅仅38年前,很多人认为它是在1900公历之后years@AbrahamJosef更新了我的答案,有更多的解释。看一看。
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");
}
using System.Globalization;
string str = someDate.ToString(CultureInfo.InvariantCulture);