繁体   English   中英

对于某些确切的日期,发生了“字符串未被识别为有效的DateTime。”错误

[英]"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。”错误。

引发异常的确切日期是:

  1. 22/07 /(任何一年)
  2. 22/09 /(任何一年)
  3. 19/05 /(任何一年)
  4. 20/05 /(任何一年)
  5. 21/05 /(任何一年)

我的示例代码的一部分:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM