1 /* Copyright 2002-2023 CS GROUP
2 * Licensed to CS GROUP (CS) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * CS licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.orekit.time;
18
19 import java.io.Serializable;
20
21 import org.hipparchus.CalculusFieldElement;
22
23 /** Interface for time scales.
24 * <p>This is the interface representing all time scales. Time scales are related
25 * to each other by some offsets that may be discontinuous (for example
26 * the {@link UTCScale UTC scale} with respect to the {@link TAIScale
27 * TAI scale}).</p>
28 * @author Luc Maisonobe
29 * @see AbsoluteDate
30 */
31 public interface TimeScale extends Serializable {
32
33 /** Get the offset to convert locations from {@link TAIScale} to instance.
34 * @param date conversion date
35 * @return offset in seconds to add to a location in <em>{@link TAIScale}
36 * time scale</em> to get a location in <em>instance time scale</em>
37 * @see #offsetToTAI(DateComponents, TimeComponents)
38 */
39 double offsetFromTAI(AbsoluteDate date);
40
41 /** Get the offset to convert locations from {@link TAIScale} to instance.
42 * @param date conversion date
43 * @param <T> type of the filed elements
44 * @return offset in seconds to add to a location in <em>{@link TAIScale}
45 * time scale</em> to get a location in <em>instance time scale</em>
46 * @see #offsetToTAI(DateComponents, TimeComponents)
47 * @since 9.0
48 */
49 <T extends CalculusFieldElement<T>> T offsetFromTAI(FieldAbsoluteDate<T> date);
50
51 /** Get the offset to convert locations from instance to {@link TAIScale}.
52 * @param date date location in the time scale
53 * @param time time location in the time scale
54 * @return offset in seconds to add to a location in <em>instance time scale</em>
55 * to get a location in <em>{@link TAIScale} time scale</em>
56 * @see #offsetFromTAI(AbsoluteDate)
57 */
58 default double offsetToTAI(final DateComponents date, final TimeComponents time) {
59 final AbsoluteDate reference = new AbsoluteDate(date, time, new TAIScale());
60 double offset = 0;
61 for (int i = 0; i < 8; i++) {
62 offset = -offsetFromTAI(reference.shiftedBy(offset));
63 }
64 return offset;
65 }
66
67 /** Check if date is within a leap second introduction <em>in this time scale</em>.
68 * <p>
69 * This method will return false for all time scales that do <em>not</em>
70 * implement leap seconds, even if the date corresponds to a leap second
71 * in {@link UTCScale UTC scale}.
72 * </p>
73 * @param date date to check
74 * @return true if time is within a leap second introduction
75 */
76 default boolean insideLeap(final AbsoluteDate date) {
77 return false;
78 }
79
80 /** Check if date is within a leap second introduction <em>in this time scale</em>.
81 * <p>
82 * This method will return false for all time scales that do <em>not</em>
83 * implement leap seconds, even if the date corresponds to a leap second
84 * in {@link UTCScale UTC scale}.
85 * </p>
86 * @param date date to check
87 * @param <T> type of the filed elements
88 * @return true if time is within a leap second introduction
89 * @since 9.0
90 */
91 default <T extends CalculusFieldElement<T>> boolean insideLeap(final FieldAbsoluteDate<T> date) {
92 return false;
93 }
94
95 /** Check length of the current minute <em>in this time scale</em>.
96 * <p>
97 * This method will return 60 for all time scales that do <em>not</em>
98 * implement leap seconds, even if the date corresponds to a leap second
99 * in {@link UTCScale UTC scale}, and 61 for time scales that do implement
100 * leap second when the current date is within the last minute before the
101 * leap, or during the leap itself.
102 * </p>
103 * @param date date to check
104 * @return 60 or 61 depending on leap seconds introduction
105 */
106 default int minuteDuration(final AbsoluteDate date) {
107 return 60;
108 }
109
110 /** Check length of the current minute <em>in this time scale</em>.
111 * <p>
112 * This method will return 60 for all time scales that do <em>not</em>
113 * implement leap seconds, even if the date corresponds to a leap second
114 * in {@link UTCScale UTC scale}, and 61 for time scales that do implement
115 * leap second when the current date is within the last minute before the
116 * leap, or during the leap itself.
117 * </p>
118 * @param date date to check
119 * @param <T> type of the filed elements
120 * @return 60 or 61 depending on leap seconds introduction
121 * @since 9.0
122 */
123 default <T extends CalculusFieldElement<T>> int minuteDuration(final FieldAbsoluteDate<T> date) {
124 return 60;
125 }
126
127 /** Get the value of the previous leap.
128 * <p>
129 * This method will return 0.0 for all time scales that do <em>not</em>
130 * implement leap seconds.
131 * </p>
132 * @param date date to check
133 * @return value of the previous leap
134 */
135 default double getLeap(final AbsoluteDate date) {
136 return 0;
137 }
138
139 /** Get the value of the previous leap.
140 * <p>
141 * This method will return 0.0 for all time scales that do <em>not</em>
142 * implement leap seconds.
143 * </p>
144 * @param date date to check
145 * @param <T> type of the filed elements
146 * @return value of the previous leap
147 * @since 9.0
148 */
149 default <T extends CalculusFieldElement<T>> T getLeap(final FieldAbsoluteDate<T> date) {
150 return date.getField().getZero();
151 }
152
153 /** Get the name time scale.
154 * @return name of the time scale
155 */
156 String getName();
157
158 }