C# 将日期(年、月、日)转换为朱利安日数并返回到日期

C# 将日期(年、月、日)转换为朱利安日数并返回到日期,c#,calendar,julian-date,C#,Calendar,Julian Date,我正在尝试实现两个功能,1)将日期转换为朱利安日数,2)将朱利安日数转换回日期(年、月和日)。我的代码返回的结果被关闭了一天。我不熟悉该算法的工作原理,但我可以看出,如果我采用朱利安数的Math.Ceiling,它会工作,但我不确定这是修复代码的最佳方法。任何帮助都将不胜感激。多谢各位 public class Program { /// <summary> /// Converts year, month and day to a Julian number

我正在尝试实现两个功能,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!
    }
}
公共类程序
{
/// 
///将年、月和日转换为朱利安数
/// 
/// 
/// 
/// 
/// 
公共静态十进制年数(整数年、整数月、整数日)
{
十进制a、b、c、e、f;
如果(月=1 | |月=2)
{
年份-=1;
月份+=12;
}
a=数学截断((十进制)年/100);
b=数学截断(a/4);
c=2-a+b;
e=数学截断((3.6525亿*(年+4716));
f=数学截断((30.6001m*(月+1));
回报率(c+D+e+f-1524.5m);
//返回数学上限(c+day+e+f-1524.5m);
}
/// 
///将儒略数转换为年、月和日
/// 
/// 
/// 
公共静态(整数年、整数月、整数日)公历日期(十进制julianNumber)
{
int l,n,i,j,k;
l=(int)朱利安人数+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;
返回(i,j,k);
}
公共静态void Main(字符串[]args)
{
var(年1月1日)=(2010年1月2日);
var(第2年,第2个月,第2天)=格里高利日期(第1年,第1个月,第1天);
Console.WriteLine(year1==year2);//True
Console.WriteLine(month1==month2);//True
Console.WriteLine(day1==day2);//False!
}
}

问题在于朱利安·戴的定义。摘自您链接的页面:

在赫歇尔的带领下,天文学家采用了这个系统,并将中午GMT-4712-01-01 JC(公元前4713年1月1日)作为他们的零点

因此,2018-05-28 00.00时为2458266.5,而2018-05-28 12.00时为2458267。如果您在观看
JulianNumber
时没有使用
Math.Ceiling
,实际上返回2458266.5。现在,(您使用了第二种方法,
GregorianDate
,它只使用整数,因此它适用于中午(12.00)的日期。因此,通过将
JulianNumber
的结果四舍五入(上限),您将日期移到12.00小时,并使其与
GregorianDate
兼容


可能的解决方案:使用中存在的算法,并在任何地方仅使用
int
(以显示忽略小时、分钟、秒的事实),或搜索另一种算法,作为其中一种可能算法的可能实现,您应该向我们展示算法的来源:@xanatos我从这里得到它:@nodejs您的JulianNumber与链接url中的完全不同。即
jd=(1461*(y+4800+(m-14)/12))/4+(367*(m-2-12*((m-14)/12))/12-(3*((y+4900+(m-14)/12)/100))/4+d-32075
,仅带整数除法(除法应理解为整数算术,并丢弃余数,以及(m-14)/12表示m为-1,请注意,您的舍入问题可能是由以下事实引起的:朱利安节从中午开始……因此2018年5月28日00.00表示2458266.5