将公历日期转换为乌姆古拉时丢失一天

Losing a day when converting a Gregorian date to Um al Qura

提问人:Ken Jackson 提问时间:6/25/2013 更新时间:8/12/2015 访问量:2728

问:

我在使用 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);

运行此操作后,year 是 1434,month 是 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 点,这是正确的。

更奇怪的是,这段代码位于一个大型应用程序的深处:C# 代码是从 VB6 exe 调用的。

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

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

任何想法都非常感谢。

C# 日期时间 net-2.0

评论

0赞 ahmedsafan86 6/25/2013
您始终可以调整回历,因为计算有时不准确,当计算机说明天不是斋月的第一天并且人们在一天结束时看到月亮时,计算将更改以同步实际日历,回历不应该通过方程式计算,而是通过月亮的外观来计算。在“控制面板”的“区域和语言”设置中,如果选择回历,则可以设置回历日期的调整
0赞 Ken Jackson 6/25/2013
是的,这是我对回历的理解,但我使用的是乌姆古拉历法(msdn.microsoft.com/en-us/library/...),它没有调整系数。

答:

0赞 Kaveh Shahbazian 6/25/2013 #1

我已经测试了你的代码:

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 中,我得到了答案。所以这似乎是 .NET 2.0 中的一个错误。1434 / 8 / 15

还要检查是否是(应该是这样)。因为如果是这样,可能会有一些像这样的细微差异。umAlQuraCalendar.AlgorithmTypeLunarCalendarLunisolarCalendar

评论

0赞 Ken Jackson 6/25/2013
是的,在这两种情况下都是.我只是对为什么它在独立的 .NET 2.0 项目中正常工作感到困惑。这让我认为这是我的应用程序中的东西,而不是 .NET 2.0 错误umAlQuraCalendar.AlgorithmTypeLunarCalendar
0赞 Kaveh Shahbazian 6/25/2013
另外,我隐约记得我的 VB6 时代有问题。time
0赞 Yasser Amer 8/12/2015 #2

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