2017-05-26 58 views
0

我有一个问题在我的ASP.NET中使用默认系统“en-GB”culture将公历日期转换为波斯语(Hijri日历) 。MVC应用 我用全球化的标签在我的web.config所以默认文化将是“EN-GB”:“字符串未被识别为有效日期时间”在某些确切日期发生错误

<system.web> 
     ... 
     <globalization uiCulture="en-GB" culture="en-GB" /> 
     ... 
    </system.web> 

转换将会针对不同的是我列出了他们下面这些确切日期的任何日期并且会抛出“字符串未被识别为有效的日期时间。”错误。

确切日期,这将引发异常是:

  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! 
    } 

希望你们能帮助我。 谢谢。

+2

请您提供[mcve]而不是片段,并提供您想要实现的更多细节?请记住,公历中的'DateTime'总是*总是*您的“转换”代码看起来不像它会对我有用*的结果。 (您可能会发现我的Noda Time项目在这里更加有用,因为它的'LocalDate'等类型*会*保留日历信息。) –

+0

举例来说,22/07/2017(格里高利)是31/04/1396(波斯语) 。您如何期望将其解析为公历? –

+0

为什么你在第一个地方建立这个字符串?如果你想使用波斯文日历文化打印日期时间,为什么不只是在格式字符串中指定文化,例如'String.Format(CultureInfo.GetCultureInfo(“fa-IR”),“{0}”,DateTime.Now )'。 *日期时间*值不会更改 –

回答

8

抛开解析错误,这不会实现你想达到的目标。 A DateTime值为总是在公历中 - 试图解析31/04/1396为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等,但您需要记住在任何地方都这样做。)

1

DateTime目的是在公历(来自MSDN DateTime specification):

DateTime值类型表示值的范围的日期和时间从00:00:00(午夜),1月1日,0001公元(公元9999年12月31日下午11:59:59公历(公历)。直到目标天都在目标本月范围阳历

你的解决方案是有效的。 (联合国)fortune DateTime结构是密封的意思是,你不能重写它。

因为这将限制的,我建议做出某种PersianDateTimeUtility类的,其中将解析对象作为DateTime到指定的类型(例如String)的逻辑,比较日期等 有用于该目的一些框架,但我没有测试过它们,所以我不会描述它们。

+0

谢谢,但你能给我请输入一段有效的代码 –

+0

要清楚 - “DateTime”不是“公历”中的“DateTime”。就其本身而言,它所做的就是计算自过去某个固定点以来的100纳秒间隔的数量。我相信当时的文档是说它支持一系列的日期,并且日历范围对应于格里历中的01/01/0001 - 31/12/9999。也就是说,“在格里历中”附加到范围内,而不是“DateTime”类。 –

+0

我没有找到解决方案如何使'DateTime'作为'31.04.YYYY'日期的表示法,但可以这样做。有效的代码片段取决于目的。你只需要显示这个日期?或比较?你是序列化它吗?这个话题中有太多未知数。 – MarBog

相关问题