System.Globalization.HebrewCalendar类的问题?

时间:2014-07-03 19:13:55

标签: .net vb.net datetime calendar globalization

我有以下代码,一个简单的例子,我想扩展它以计算Yartzeit日期(死亡纪念日)。 该代码为犹太人日期5771/1/1增加了1个月。它给了我一个例外,我无法弄清楚为什么(我对犹太日期知之甚少):

Imports System
Imports System.Globalization
Imports System.Threading 

Public Module Module1
    Public Sub Main()
        Dim hc As New HebrewCalendar()
        Dim jewishCulture As CultureInfo = CultureInfo.CreateSpecificCulture("he-IL")
        jewishCulture.DateTimeFormat.Calendar = hc
        Thread.CurrentThread.CurrentUICulture = jewishCulture
        Dim startDate = new DateTime(5771,1,1)
        Console.WriteLine(startDate.ToString())
        startDate = hc.AddMonths(startDate, 1)      
        Console.WriteLine(startDate.ToString())
    End Sub
End Module

这是结果(来自.NET Fiddle,我在本地有相同的结果):

1/1/5771 12:00:00 AM
Run-time exception (line -1): Value to add was out of range.
Parameter name: months

Stack Trace:

[System.ArgumentOutOfRangeException: Value to add was out of range.
Parameter name: months]

根据HebrewCalendar.AddMonths方法(http://msdn.microsoft.com/en-us/library/system.globalization.hebrewcalendar.addmonths(v=vs.110).aspx)上的文档,如果"月小于-120,000或大于120,000,则应抛出ArgumentOutOfRangeException。"。这显然不是这里的情况,我将1个月添加到第1个月。 .NET HebrewCalendar类是否存在已知问题?还是我想念的其他东西?

谢谢,

PS:我使用HebrewCalendar.AddMonths而不是DateTime.AddMonths方法,因为HebrewCalendar.AddMonths上有以下注释:"如果生成的日期是结果日期,则生成的DateTime的日期部分会受到影响在结果年份的结果月份中不是有效日期。它将更改为生成年份的最后一个有效日期。"。

1 个答案:

答案 0 :(得分:0)

这里有两个问题:

  • 您正在将文化分配给CurrentUICulture。这对DateTime没有影响。如果您有本地化的resx文件,UI文化将确定要使用的本地化资源文件。您应该设置CurrentCulture,而不是在数字和日期格式中使用。

    Thread.CurrentThread.CurrentCulture = jewishCulture
    
  • 如果您从个别年,月,日部分构建DateTime时未使用公历,则必须将日历作为参数传递。 See the remarks in the MSDN docs

    Dim startDate = new DateTime(5771,1,1, hc)
    

    请记住,DateTime对象本身只是格里高利历中自0001/01/01以来传递的刻度数的包装。 始终在其属性和方法中使用公历。 (如果你看startDate.Year,它将是2010年,而不是5771年。)

    要添加“1希伯来月” - 您必须致电HebrewCalendar.AddMonths而不是DateTime.AddMonths。你有这个权利,但这不仅仅是因为你描述的原因。

此外,您可能对Jon Skeet在Noda Time 1.3中的最新作品感兴趣,该作品为希伯来日历增加了实验支持。请在"Hebrew" in the user guide下阅读,并阅读the comments in the 1.3 release notes。总的来说,我相信Jon对希伯来日历的解释比我信任.Net Framework的HebrewCalendar类更好。 (见this discussion。)