我正在尝试实现两个功能,1)将日期转换为儒略日数和 2)将儒略日数转换回日期(年、月和日)。我的代码返回的结果是关闭了一天。我不熟悉算法的工作原理,但我可以看到,如果我采用Math.Ceiling朱利安数,它可以工作,但我不确定这是修复代码的最佳方法。任何帮助将不胜感激。谢谢你。public class Program{ /// <summary> /// Converts year, month and day to a Julian number /// </summary> /// <param name="year"></param> /// <param name="month"></param> /// <param name="day"></param> /// <returns></returns> public static decimal JulianNumber(int year, int month, int day) { decimal a, b, c, e, f; if (month == 1 || month == 2) { year -= 1; month += 12; } a = Math.Truncate((decimal) year / 100); b = Math.Truncate(a / 4); c = 2 - a + b; e = Math.Truncate((365.25m * (year + 4716))); f = Math.Truncate((30.6001m * (month + 1))); return (c + day + e + f - 1524.5m); // return Math.Ceiling(c + day + e + f - 1524.5m); } /// <summary> /// Converts Julian number to year, month and day /// </summary> /// <param name="julianNumber"></param> /// <returns></returns> public static (int year, int month, int day) GregorianDate(decimal julianNumber) { int l, n, i, j, k; l = (int)julianNumber + 68569; n = 4 * l / 146097; l = l - (146097 * n + 3) / 4; i = 4000 * (l + 1) / 1461001; l = l - 1461 * i / 4 + 31; j = 80 * l / 2447; k = l - 2447 * j / 80; l = j / 11; j = j + 2 - 12 * l; i = 100 * (n - 49) + i + l; return (i, j, k); } public static void Main(string[] args) { var (year1, month1, day1) = (2010, 1, 2); var (year2, month2, day2) = GregorianDate(JulianNumber(year1, month1, day1)); Console.WriteLine(year1 == year2); // True Console.WriteLine(month1 == month2); // True Console.WriteLine(day1 == day2); // False! }}
1 回答
慕莱坞森
TA贡献1810条经验 获得超4个赞
问题在于儒略日的定义。取自您链接的页面:
跟随赫歇尔的主要天文学家采用了这个系统,并将中午 GMT -4712-01-01 JC(公元前 4713 年 1 月 1 日)作为他们的零点
所以 00.00 的 2018-05-28 是 2458266.5,而 12.00 的 2018-05-28 是 2458267。如果你看你JulianNumber
没有Math.Ceiling
,实际上返回 2458266.5。现在,您链接的页面(您从中采用了第二种方法,GregorianDate
仅使用整数,因此它适用于中午(12.00)的日期。因此,通过四舍五入(上限),JulianNumber
您将日期移动到12.00 小时,并使其与GregorianDate
.
可能的解决方案:用于同一页面中JulianNumber
存在的算法并且仅在任何地方使用(以表明您忽略了小时、分钟、秒的事实),或者为 搜索另一种算法。int
GregorianDate
- 1 回答
- 0 关注
- 128 浏览
添加回答
举报
0/150
提交
取消