1. 单位
STK组件采用国际单位制:
物理量 | 单位 | 类型 |
---|---|---|
时间 | 秒 | 基本单位 |
长度 | 米 | 基本单位 |
质量 | 千克 | 基本单位 |
温度 | 开尔文 | 基本单位 |
角度 | 弧度 | 导出单位 |
频率 | 赫兹 | 导出单位 |
压力 | 帕斯卡 | 导出单位 |
功率 | 瓦特 | 导出单位 |
2. 时间和时间标准
我们日常生活中常用的是加了时区的协调世界时,在科学计算特别是天文方面的计算中,有多个时间标准。存在各种时间标准是为了解释地球相对于太阳自转的明显时间飘移,解释在不同参考架中观察到的相对论效应对时间飘移的影响。秒是用于表示时间量的基本计量单位。然而秒的定义取决于所使用的特定时间标准。
2.1. 时间标准
STK组件支持的时间标准如下表所示,所有这些时间标准都可以通过TimeStandard
类的静态属性访问。
名称 | 缩写 | 类型 |
---|---|---|
世界时1 | UT1 | 地球旋转时间 |
协调世界时 | UTC | 原子时间 |
GPS时间 | GPS | 原子时间 |
国际原子时 | TAI | 原子时间 |
地球时 | TT | 原子时间 |
质心动力学时 | TDB | 相对论动力学时间 |
- 不同时间标准的转换可使用
TimeStandardConverter
类的静态方法实现 - 可通过创建
TimeStandard
的实例,实现自定义的时间标准
2.2. JulianDate
JulianDate
是一个结构体,用来表示儒略日时间。它内部由三个字段组成:
-
整数部分:
int
型,从公元前4713年1月1日起算的连续天数 -
小数部分:
double
型,当天从0点起算的秒数 -
时间标准:
TimeStandard
类型,当前实例的时间标准
每个JulianDate
都有特定的时间标准,JulianDate
有8种构造函数
,可在创建时指定时间标准,如果不直接指定,会使用默认的时间标准。
- 默认采用UTC:
public JulianDate(DateTime dateTime)
public JulianDate(GregorianDate gregorianDate)
- 默认采用TAI:
public JulianDate(double dayCount)
public JulianDate(int day, double secondsOfDay)
- 指定时间标准:
public JulianDate(DateTime dateTime, TimeStandard standard)
public JulianDate(GregorianDate gregorianDate, TimeStandard standard)
public JulianDate(double dayCount, TimeStandard timeStandard)
public JulianDate(int day, double secondsOfDay, TimeStandard timeStandard)
不同的时间标准之间的转换可通过JulianDate.ToTimeStandard()
实现。
2.3. Duration
Duration
是一个结构体,表示持续时间。内部由三个字段组成:
-
整数部分:
int
型,持续时间的天数 -
小数部分:
double
型,扣除天数部分后,剩余持续时间的秒数 -
时间标准:
TimeStandard
类型,当前实例的时间标准
和JulianDate
不同的是,Duration
的时间标准不是必须指定的,如果没有指定,在与JulianDate
运算时,会默认采用该JulianDate
的时间标准。
2.4. GregorianDate
GregorianDate
是一个结构体,表示公历中的日历日期,和C#中常用的DateTime
类似。GregorianDate
没有时间标准,它被假定为协调世界时(UTC)。如果秒值是从60到61,则表示为闰秒。
内部由YearMonthDay
(结构体)、时(int
)、分(int
)、秒(double
)组成
2.5. 时间转换
STK组件提供了一个名为TimeStandardConverter
的静态类可进行时间标准转换:
-
public static JulianDate Convert(JulianDate value, TimeStandard to)
转换给定的JulianDate
到指定的时间标准 -
public static bool TryConvert(JulianDate value, TimeStandard to, out JulianDate result)
尝试转换给定的JulianDate
到指定的时间标准,成功返回true
,失败返回false
-
public static void RegisterConversion(TimeStandard from, TimeStandard to, FormatConversionCallback<JulianDate, TimeStandard> conversion)
注册自定义的时间转换方法,当自定义了一个时间标准时,这个方法很有用处
2.6. 示例
- 时间转换为JulianDate的协调世界时(UTC)
var dateTime = new DateTime(2019, 5, 20);
var jdUTC = new JulianDate(dateTime, TimeStandard.CoordinatedUniversalTime);
Console.WriteLine("时间:{0},儒略日:{1}", jdUTC, jdUTC.TotalDays);
- 时间转换为JulianDate的国际原子时(TAI)
var jdTAI = new JulianDate(dateTime, TimeStandard.InternationalAtomicTime);
Console.WriteLine("时间:{0},儒略日:{1}", jdTAI, jdTAI.TotalDays);
- 与J2000时刻的时间差
var jdTT = new JulianDate(dateTime, TimeStandard.TerrestrialTime);
Duration diff = jdTT - TimeConstants.J2000;
Console.WriteLine("时间差:{0}天", diff.TotalDays);
- 利用
JulianDate.ToTimeStandard()
转换时间标准:UTC转为TAI
JulianDate jdTAI2 = jdUTC.ToTimeStandard(TimeStandard.InternationalAtomicTime);
Console.WriteLine("时间:{0},儒略日:{1}", jdTAI2, jdTAI2.TotalDays);
- 利用
TimeStandardConverter.Convert()
转换时间标准:TAI转UTC
JulianDate jdUTC2 = TimeStandardConverter.Convert(jdTAI2, TimeStandard.CoordinatedUniversalTime);
Console.WriteLine("时间:{0},儒略日:{1}", jdUTC2, jdUTC2.TotalDays);
-
JulianDate
加上指定天数
JulianDate jd = jdUTC.AddDays(7);
Console.WriteLine("时间:{0},儒略日:{1}", jd, jd.TotalDays);
源代码地址
https://github.com/icgp/STKComponentsTutorial/blob/master/Example003/Example003.cs