STK组件基础篇:时间

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容