[英]"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.