C# 将日期(年、月、日)转换为朱利安日数并返回到日期
我正在尝试实现两个功能,1)将日期转换为朱利安日数,2)将朱利安日数转换回日期(年、月和日)。我的代码返回的结果被关闭了一天。我不熟悉该算法的工作原理,但我可以看出,如果我采用朱利安数的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
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