在天文学上一般使用儒略日进行计时,这个做法和计算机内部表达时间基本上是一样的。这个做法其实就是序列号时间编码,表示指定时间和某个零点时刻之间的时差。这么做法的好处是,不受历法莫名其妙的各种变动的影响,管你大月小月闰年闰月的,反正我连续计算。
儒略日(Julian day)是指由公元前4713年1月1日,協調世界時中午12時開始所經過的天數,多為天文學家採用,用以作為天文學的單一曆法,把不同曆法的年表統一起來。
儒略日是一种不用年月的长期纪日法,简写为JD。是由法国紀年學家史迦利日(Joseph Justus Scliger 1540年-1609年)在1583年所创,这名称是为了纪念他的父亲——意大利学者Julius Caesar Scaliger(1484年-1558年)。
以儒略日计日是为方便计算年代相隔久远或不同历法的两事件所间隔的日数。
儒略日的起点订在公元前4713年(天文学上记为 -4712年)1月1日格林威治时间平午(世界时12:00),即JD 0指定为UT时间B.C.4713年1月1日12:00到UC时间B.C.4713年1月2日12:00的24小时。每一天赋予了一个唯一的数字,顺数而下,如:1996年1月1日12:00:00的儒略日是2450084。这个日期是考虑了太阳、月亮的轨道运行周期,以及当时收税的间隔而订出来的。Joseph Scliger定义儒略周期为7980年,是因28、19、15的最小公倍数为28×19×15=7980。其中:
28年为一太阳周期(solar cycle),经过一太阳周期,则星期的日序与月的日序会重复。
19年为一太阴周期,或称默冬章(Metonic cycle),因235朔望月=19回归年,经过一太阴周期则阴历月年的日序重复。
15年为一小纪(indiction cycle),此为罗马皇帝君士坦丁一世(Constantine I)所颁,每15年评定财产价值以供课税,成为古罗马用的一个纪元单位,
故以7980年为一儒略周期,而所选的起点公元前4713年,则是这三个循环周期同时开始的最近年份。
由于儒略日数字位数太多,国际天文学联合会于1973年采用简化儒略日(MJD),其定义为MJD = JD - 2400000.5。MJD相应的起点是1858年11月17日世界时0时。
在C语言中,有一个函数time()可以获取当前的秒数,在中,返回值类型为time_t,time_t是long的同义词(typedef long time_t)。
获取的秒数是从1970年1月1日0:00:00开始到当前时间的秒数。其参数不详(其实是我懒着去查了)。
time_t t = time(NULL); 即可获取时间,精确到秒。
获取时间后,t/86400,就是日期,t%86400,就是当天从零点开始的秒数。再转换成具体年月日时分秒就很方便了。计算星期什么的也很方便。唯一会带来麻烦的是,如果要计算1970年之前的事情,就麻烦了。
要计算t对应的儒略日,就是 jd = t / 86400 + 2440587.5;
2440587.5是1970-01-01的儒略日。如果是要计算简化儒略日(MJD: Modified Jilian Day),那么只要加40587就好了。
如果一般的计算,就用MJD,这样可以避免因为整数部分太大引起小数部分精度缺失。
恒星时是天球子午圈的单位,其实是个角度单位,不过在涉及到经度(赤经、黄经等等都一样)处理时,有时为了和地球上的24小时对应,会以时间单位来表示。也就是0度对应0:00:00,180度对12:00:00,270度对18:00:00这样。当进行天文观测时,要根据当前天顶恒星时进行选择目标,并且确定天球坐标系和大地坐标系之间的关系。
按理说两个公式都是一样的,但是我按wiki的计算死活算不对,估计是哪个参数理解错了吧。用后者提供的IAU1982公式计算,与兴隆站网页的计算结果之间,误差大概在70秒左右。
long mjd = t / 86400 + 40587; //简化儒略日
long td = t % 86400; //一天内的时间
double d = (mjd - 51545.0) / 36525; //修正因子T
long st = (long)(
24110.54841 + (8640184.812866 + (0.093104 - 0.0000062 * d) * d) * d + //T的多项式
td * 1.00273790935 + //当天时间的因子
longtitude * 240 //经度引起的地方时因子
);
st %= 86400; if (st < 0) st += 86400; //将结果处理在0到24小时以内
return st;
以上单位,时间一律按秒(可能有小数部分,但是在最终保存的时候砍掉了),经度以度为单位(0-360度,分、秒等转换成小数),结论是以时间秒为单位(0-84600)
显示的时候 hour = st / 3600; minute = st / 60 % 60; second = st % 60。
因为写程序的目的是辅助观测,而不是控制仪器,所以这里没保留秒以下。