簡體   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