日期到日期时间,包括小时和分钟
本文关键字:日期 分钟 小时 时间 包括 | 更新日期: 2023-09-27 18:13:48
我正在尝试将包括小时,分钟和秒的儒略历日期转换为c#中的DateTime。
号码:2457285.7795969
我可以计算DateTime
不包括的小时和分钟。
public static DateTime FromJulian(long julianDate)
{
long L = julianDate + 68569;
long N = (long)((4 * L) / 146097);
L = L - ((long)((146097 * N + 3) / 4));
long I = (long)((4000 * (L + 1) / 1461001));
L = L - (long)((1461 * I) / 4) + 31;
long J = (long)((80 * L) / 2447);
int Day = (int)(L - (long)((2447 * J) / 80));
L = (long)(J / 11);
int Month = (int)(J + 2 - 12 * L);
int Year = (int)(100 * (N - 49) + I + L);
return new DateTime(Year, Month, Day);
}
应该像这样简单:
public static DateTime FromJulian(double julianDate)
{
return new DateTime(
(long)((julianDate - 1721425.5) * TimeSpan.TicksPerDay),
DateTimeKind.Utc);
}
可以看到,1721425.5
是所谓的格里高利历,即朱利安日期在预言格里高利历开始时的值,在0001 1月1日,00:00:00.0000000,其中。net DateTime
有它的起源。
编辑:如果您想确保您的方法在"极端"输入时抛出异常,而不是返回无效值,请这样做:
public static DateTime FromJulian(double julianDate)
{
return new DateTime(
checked((long)((julianDate - 1721425.5) * TimeSpan.TicksPerDay)),
DateTimeKind.Utc);
}
注意,我们使用double operator *(double, double)
重载(c#中内置的)来进行乘法运算。这样可以尽可能少地产生错误。如果double
在long
的范围之外,那么从double
到long
的转换将抛出checked
上下文。如果转换顺利,如果long
的值超出了. net DateTime
的范围,DateTime
构造函数可能会抛出。
新编辑:灵感来自另一个线程(转换日期时间到朱利安日期在c# (ToOADate安全?))),你也可以制定一个非常简单的解决方案,使用DateTime.FromOADate
。但是,请参阅我自己关于FromOADate
方法精度缺点的另一篇Stack Overflow文章。
这是你正在寻找的:将儒略历日期与时间(H/m/s)转换为c#中的日期时间?
应用该答案,将您的值2457285.7795969转换为9/19/2015 11:42:37 PM。
在Ladi回答我正在寻找的东西之前....
double L = DateTime.Now.ToOADate() + 2415018.5 + 68569;
double HMS = L-(int)L-0.5;
int Hours = (int)(24*HMS);
HMS=HMS - (double)(Hours/24.0);
int Mins = (int)(24*60*HMS);
HMS=HMS - (double)(Mins/(24.0*60));
int Secs = (int)(24*60*60*HMS);
long N = (long)((4 * L) / 146097);
L = L - ((long)((146097 * N + 3) / 4));
long I = (long)((4000 * (L + 1) / 1461001));
L = L - (long)((1461 * I) / 4) + 31;
long J = (long)((80 * L) / 2447);
int Day = (int)(L - (long)((2447 * J) / 80));
L = (long)(J / 11);
int Month = (int)(J + 2 - 12 * L);
int Year = (int)(100 * (N - 49) + I + L);
DateTime test = new DateTime(Year, Month, Day);
Console.WriteLine("Hours-"+Hours);
Console.WriteLine("Mins-" + Mins);
Console.WriteLine("Secs-"+ Secs);
Console.WriteLine(test);
Console.WriteLine(DateTime.Now.ToString());