我使用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");
将文化改为阿拉伯语,但没有任何运气。
以下是变量快速监视的屏幕截图
答案 0 :(得分:9)
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, 1398
为ArgumentOutOfRangeException
,因此抛出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);