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

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

我使用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.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);