我正在尝试将朱利安时间戳转换为日期时间。我有以下微秒时间戳 212302469304212709 。据我所知,我需要将这些毫秒添加到朱利安日历的开头(公元前4713年1月1日,中午12点(中午))。所以我有以下方法:
private DateTime GetDateTime(string julianTimeStamp)
{
var julianMilliseconds = Convert.ToDouble(julianTimeStamp)/1000;
var beginningOfTimes = new DateTime(1, 1, 1, 0, 0, 0, 0);
var dateTime = beginningOfTimes.AddMilliseconds(julianMilliseconds).AddYears(-4713).AddMonths(-1).AddDays(-1).AddHours(-12);
return dateTime;
}
假设我传递212302469304212709字符串作为参数。预期结果应为2015/07(7月)/ 01 00:08:24.212。基于我的方法,我有几乎相同的结果,但是一天不是1,它是6.我测试的不同时间戳的相同问题。 谁能告诉我我做错了什么?提前致谢。
编辑: 这是我期望收到的确切日期时间:2015(年)7(月)1(日)0(小时)8(分钟)24(秒)212(毫秒)709(微秒)
答案 0 :(得分:2)
DateTime使用格里高利历,所以当你减去年,月等时,你正在使用该日历,而不是朱利安。
不幸的是,DateTime不支持第1年之前的日期。您可以在this post中查看图书馆,也许它对您有帮助。
答案 1 :(得分:2)
给定时间戳212,302,469,304,212,709μs转换为天数(仅除以86,400,000,000)给出2457204.505836天(小数点后六位,这是我能做的最好而没有太多额外的麻烦)。使用由美国海军天文台编写的多年计算机交互式年历(MICA),并将自由格式日期2015年(年)7(月)1(日)0(小时)8(分钟)24(秒)212 (毫秒)709(微秒),程序计算完全相同的日计数(小数点后六位),证明时间戳是准确的朱利安日期。
OP的计算的一个问题是尝试在最早支持的日期之前使用DateTime类,正如另一张海报所指出的那样。此外,OP没有说2015年7月1日是否在Julian或Gregorian日历中,但是MICA计算证明它是在公历中。由于OP在格里高利历中起作用,所以Julian日期的时代应该在格里高利时期日历中公布:世界时间,公元前4714年11月24日。经常引用的日期是公元前4713年1月1日,是一个可以预见的朱利安日历日期。
“Proleptic”表示从现代日期开始找到日期,其日历日期是绝对确定的,并且向后应用所选日历的规则直到达到所需日期,即使所需日期是在选择的日历发明之前。