我有以下代码,一个简单的例子,我想扩展它以计算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的日期部分会受到影响在结果年份的结果月份中不是有效日期。它将更改为生成年份的最后一个有效日期。"。
答案 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。)