时间

本教程介绍如何在Orekit中处理时间。

基本用法

第一个示例将介绍基本用法:创建日期、比较日期和打印日期。我们将构建一个小程序,在开始日期和结束日期之间循环,并以两种不同的时间尺度(UTC和TAI)打印日期。循环将围绕闰秒的引入进行,以查看两种时间尺度的偏移变化。

此示例的完整代码可以在库的源代码树中的文件src/main/java/org/orekit/tutorials/time/Time1.java中找到。

如库架构文档中的时间部分所述,日期是根据时间尺度定义的。我们首先获取所需的两个时间尺度。这些尺度是单例,因此我们不需要构建它们,而是检索单例实例,如下所示:

TimeScale utc = TimeScalesFactory.getUTC();
TimeScale tai = TimeScalesFactory.getTAI();

一旦我们有了UTC时间尺度,我们就可以使用它的组件相对于UTC时间尺度创建开始日期:

AbsoluteDate start = new AbsoluteDate(2005, 12, 31, 23, 59, 50, utc);

对于我们循环的结束日期,我们将使用相对定义而不是绝对定义。我们希望结束日期在开始日期之后20秒。

double duration = 20.0;
AbsoluteDate end = start.shiftedBy(duration);

然后我们打印输出的标题。

System.out.println("        UTC日期                  TAI日期");

现在是真正的处理:循环。由于AbsoluteDate实例是不可变的,我们在每次迭代时使用一个新实例。对于第一次迭代,我们只需重用开始日期,对于其他迭代,我们创建相对于前一个日期的实例。

double step = 0.5;
for (AbsoluteDate date = start;
     date.compareTo(end) < 0;
     date = date.shiftedBy(step)) {
   // 循环体
}

在循环体内(即替换上面代码片段中的注释),我们以两种不同的时间尺度打印日期。需要注意的一点是,我们只使用一个AbsoluteDate实例,但可以将其与多个不同的时间尺度关联起来。

System.out.println(date.toString(utc) + "   " + date.toString(tai));

由于循环包围了闰秒的引入,我们在此程序的输出中看到两件不同的事情。首先,中间的迭代显示UTC时间尺度中一天的最后一分钟超过60秒:我们看到日期2005-12-31T23:59:60.000和2005-12-31T23:59:60.500。其次,我们看到两个时间尺度之间的偏移量从循环开始时的32秒增加到循环结束时的33秒:闰秒已经被考虑进去了。

        UTC日期                  TAI日期
2005-12-31T23:59:50.000   2006-01-01T00:00:22.000
2005-12-31T23:59:50.500   2006-01-01T00:00:22.500
          ... 这里删除了16行 ...
2005-12-31T23:59:59.000   2006-01-01T00:00:31.000
2005-12-31T23:59:59.500   2006-01-01T00:00:31.500
2005-12-31T23:59:60.000   2006-01-01T00:00:32.000
2005-12-31T23:59:60.500   2006-01-01T00:00:32.500
2006-01-01T00:00:00.000   2006-01-01T00:00:33.000
2006-01-01T00:00:00.500   2006-01-01T00:00:33.500
          ... 这里删除了14行 ...
2006-01-01T00:00:08.000   2006-01-01T00:00:41.000
2006-01-01T00:00:08.500   2006-01-01T00:00:41.500