为了账号安全,请及时绑定邮箱和手机立即绑定

将日期(年、月、日)转换为儒略日数并返回到日期

将日期(年、月、日)转换为儒略日数并返回到日期

C#
慕码人2483693 2021-07-01 13:11:07
我正在尝试实现两个功能,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存在的算法并且仅在任何地方使用(以表明您忽略了小时、分钟、秒的事实),或者为 搜索另一种算法。intGregorianDate


查看完整回答
反对 回复 2021-07-10
  • 1 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信