[英]"String was not recognized as a valid DateTime.” error occurs for some exact dates
我在ASP.NET MVC应用程序中使用默认系统“ en-GB”文化将公历日期转换为波斯(回历)时遇到问题。 我在web.config中使用了全球化标记,因此默认区域性为“ en-GB”:
<system.web>
...
<globalization uiCulture="en-GB" culture="en-GB" />
...
</system.web>
转换将在任何日期发生,但我在下面列出的确切日期除外,并且将引发“字符串未被识别为有效的DateTime。”错误。
引发异常的确切日期是:
我的示例代码的一部分:
using System.Globalization;
...
...
public static PersianCalendar PC = new PersianCalendar();
...
//I'm using this method for conversion
public static DateTime GregorianToPersian(DateTime date)
{
...
string stringDate = string.Format("{0}/{1}/{2} {3}:{4}:{5}"
, PC.GetDayOfMonth(date), PC.GetMonth(date), PC.GetYear(date)
, PC.GetHour(date), PC.GetMinute(date), PC.GetSecond(date));
return DateTime.Parse(stringDate); //error!
}
希望你们能帮助我。 谢谢。
抛开解析错误,这将无法实现您想要实现的目标。 DateTime
值始终位于公历中-尝试解析1396年1月31日,因为DateTime
永远不会起作用,因为它不是公历中的有效日期。
我建议改用我的Noda Time库,在适当的类型处“知道”它们属于哪个日历系统,并且您可以在它们之间进行显式转换。 例如:
// The Gregorian calendar is used implicitly
LocalDate gregorian = new LocalDate(2017, 7, 22);
LocalDate persian = gregorian.WithCalendar(CalendarSystem.PersianArithmetic);
Console.WriteLine($"{persian:yyyy-MM-dd}");
输出:
1396-04-31
然后,您可以使用persian
进行明智的算术,例如添加一个月等,如果您天真地尝试使用DateTime
这样做会给出错误的答案。 (您可以使用Calendar.AddMonths
等,但您需要记住在各处使用它。)
DateTime
对象在公历中(根据MSDN DateTime规范 ):
DateTime值类型表示日期和时间,其值从公历9999年12月31日(公元)0001 Anno Domini(公共时代)00:00:00(午夜)到公元9999年12月31日晚上11:59:59。日历。
您的解决方案有效,直到目标日期在公历中的目标月份范围内。 (Un)幸运的是DateTime
结构是密封的,这意味着您无法覆盖它。
由于这个限制,我建议制作某种PersianDateTimeUtility
类,其中将对象作为DateTime
解析为指定类型(例如String
),比较日期等的逻辑。为此目的有一些框架,但是我尚未测试他们,所以我不会描述它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.