STK组件基础篇:时间

作者: 奔跑伯爵 | 来源:发表于2019-05-15 21:45 被阅读0次

    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

    相关文章

      网友评论

        本文标题:STK组件基础篇:时间

        本文链接:https://www.haomeiwen.com/subject/fzipaqtx.html