在将公历日期转换为Um al Qura时失去了一天

时间:2013-06-25 08:37:11

标签: c# datetime .net-2.0

使用Um al Qura日历获取C#DateTime对象的日,月和年组件时遇到问题。

代码片段是:

DateTime date = new DateTime(2013, 6, 24);
UmAlQuraCalendar umAlQuraCalendar = new UmAlQuraCalendar();
int year = umAlQuraCalendar.GetYear(date);
int month = umAlQuraCalendar.GetMonth(date);
int day = umAlQuraCalendar.GetDayOfMonth(date);

运行此之后,年份为1434,月份为8,这两者都是正确的。但是,天是14是错误的(根据这里:http://www.al-habib.info/islamic-calendar/islamic-calendar-ummulqura-2013.htm

如果我将代码更改为:

DateTime date = new DateTime(2013, 6, 24, 0, 0, 0, 1); // i.e. One millisecond after midnight
UmAlQuraCalendar umAlQuraCalendar = new UmAlQuraCalendar();
int year = umAlQuraCalendar.GetYear(date);
int month = umAlQuraCalendar.GetMonth(date);
int day = umAlQuraCalendar.GetDayOfMonth(date); 

然后一天是15,这是正确的。

为了使问题更加棘手,这段代码在一个大型应用程序的深处:从VB6 exe调用C#代码。

如果我将上面的第一个片段提取到一个独立的C#项目(.NET 2.0),则day为15,这是正确的。

我已经检查了我能想到的两个项目之间可能有所不同的东西:.NET版本,平台目标(x86),但看不到任何明显的东西。

任何想法都非常感激。

2 个答案:

答案 0 :(得分:0)

我测试了你的代码:

DateTime date = new DateTime(2013, 6, 24);
UmAlQuraCalendar umAlQuraCalendar = new UmAlQuraCalendar();

int year = umAlQuraCalendar.GetYear(date);
int month = umAlQuraCalendar.GetMonth(date);
int day = umAlQuraCalendar.GetDayOfMonth(date);

Log.Info(string.Format("{0} / {1} / {2}", year, month, day));

在.NET 4.5中,我得到1434 / 8 / 15作为答案。所以它似乎是.NET 2.0中的一个错误。

同时检查umAlQuraCalendar.AlgorithmType是否为LunarCalendar(应该是这样)。因为如果它是LunisolarCalendar,可能会有一些像这样的细微差别。

答案 1 :(得分:0)

解决方案是使用配置值+1或-1天,然后将此值添加到计算日期以更正它。