目录
1.时间系统
Cesium中,使用JulianDate模块来处理儒略日的计算,具体为Cesium软件包目录中的文件:"\Source\Core\JulianDate.js"。
1.1几种时间系统
UTC(coordinated universal time),也称协调时间时。也就是我们现在日常使用的时间。
TAI(International Atomic Time),也称原子时。
DAT 跳秒,或者闰秒,是UTC和TAI之间的差别。
TT(terrestrial time),或者为TDT,也称地球动力学时。
UT1(Universal Time1),也称格林威治平太阳时,在UT0的基础上加入了极移修正。是以地球自转为基准得到的,也是目前使用的世界时标准。
1.2几种时间之间的相互转换
1.3儒略日的计算
儒略日(Julian day,JD)是指由公元前4713年1月1日,协调世界时中午12时开始所经过的天数,当然这个天数是包含小数点的。显然,儒略日使用自然累加的天数作为时间的计时方式,是一种均匀流逝的绝对时间。
儒略日的计算涉及到闰年、闰月的处理,计算公式各种程序语言版本的都有。读者可参考书籍中的算法》
注意,儒略日的计算公式只涉及到年月日时分秒的计算,并不管是UTC还是TAI时间。当是TAI时间时,则计算得到的儒略日是正确的;而当是UTC时间时,因为有跳秒的存在,计算得到的儒略日就是“假的”,因此需要主动加上跳秒。
例如:
UTC时间:2020年9月5日12:00:00s,对应的TAI时间为2020年9月5日12:00:37s。
因为我们知道,自2017年1月1日00:00:00s,跳秒为37s。
所以说,给定UTC时间,在转换为TAI时间时,必须知道跳秒数,即前面提到的D A T DATDAT。
Cesium中,JulianDate模块中,维护了历次跳秒的时刻及跳秒数的数表(见下),在计算UTC向TAI转换时,需要查这个表,以便判断对应的跳秒数。
1.4JulianDate的结构和计算
Cesium中,使用JulianDate模块包含了相关的计算函数。
可以使用构造函数可以创建一个JulianDate对象,对象内部仅包含两个属性,且仅对应TAI时间:
dayNumber: 保留儒略日的整数部分,单位为天;
secondsOfDay:保留儒略日的小数部分,单位为秒;
之所以用两个参数来表示儒略日,是为了最大可能的保证数据的精度。例如J2000时刻,儒略日为2451545天。光整数天就需要7位有效数字,如果表示到1ms的精度,则儒略日为:2451545.00000001天,可以看出超出了一般双精度15位有效数字。因此使用内部使用整数天和不足一天的秒数来保存,从而保证了儒略日数据的精度。
其中,timeStandard表示时间类型,只有两种选择:UTC和TAI。没有则默认为UTC。当为UTC类型时,构造函数内部需要将UTC时间转换为TAI时间(涉及到跳秒数表的查询)。
其它的构造函数有:JulianDate.fromGregorianDate、JulianDate.fromDate等。