我有下面的代码,一个简单的例子,我想在上面扩展以计算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。这里显然不是这样,我在第一个月的基础上加了一个月。.NET HebrewCalendar类有没有已知的问题?或者我还遗漏了什么?
谢谢,
PS:我之所以使用HebrewCalendar.AddMonths而不是DateTime.AddMonths方法,是因为HebrewCalendar.AddMonths上的以下注释:“如果结果日期不是结果年份的结果月份中的有效日期,则结果DateTime的日期部分会受到影响。它将更改为结果年份的结果月份中的最后一个有效日期。”
发布于 2014-07-04 03:48:42
这里有两个问题:
CurrentUICulture。这将不会对DateTime产生影响。如果具有本地化的resx文件,则UI区域性确定要使用的本地化资源文件。您应该改为设置数字和日期格式中使用的CurrentCulture。Thread.CurrentThread.CurrentCulture = jewishCulture
DateTime时,您必须将日历作为参数传递。See the remarks in the MSDN docs。Dim startDate =新的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框架的HebrewCalendar类。(请参阅this discussion。)
https://stackoverflow.com/questions/24561641
复制相似问题