1 /* Copyright 2002-2025 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.files.ccsds.definitions; 18 19 import org.orekit.time.AbsoluteDate; 20 import org.orekit.time.DateTimeComponents; 21 import org.orekit.time.SatelliteClockScale; 22 import org.orekit.time.TimeScale; 23 24 /** Dates reader/writer. 25 * 26 * @author Luc Maisonobe 27 * @since 11.0 28 */ 29 public class TimeConverter { 30 31 /** Base time scale. */ 32 private final TimeScale timeScale; 33 34 /** Reference date for relative dates (may be null if no relative dates are used). */ 35 private final AbsoluteDate referenceDate; 36 37 /** Build a time system. 38 * @param timeScale base time scale 39 * @param referenceDate reference date for relative dates (may be null if no relative dates are used) 40 */ 41 public TimeConverter(final TimeScale timeScale, final AbsoluteDate referenceDate) { 42 this.timeScale = timeScale; 43 this.referenceDate = referenceDate; 44 } 45 46 /** Parse a relative or absolute date. 47 * @param s string to parse 48 * @return parsed date 49 */ 50 public AbsoluteDate parse(final String s) { 51 52 if (referenceDate != null && s.indexOf('T') < 0) { 53 54 // relative date 55 final double delta = Double.parseDouble(s); 56 if (timeScale instanceof SatelliteClockScale) { 57 // satellite clock scale handles drifts internally 58 return ((SatelliteClockScale) timeScale).dateAtCount(delta); 59 } else { 60 // regular relative date from a known reference 61 return referenceDate.shiftedBy(delta); 62 } 63 64 } else { 65 66 // absolute date 67 return new AbsoluteDate(s, timeScale); 68 69 } 70 71 } 72 73 /** Generate calendar components. 74 * @param date date to convert 75 * @return date components 76 */ 77 public DateTimeComponents components(final AbsoluteDate date) { 78 return date.getComponents(timeScale); 79 } 80 81 /** Generate relative offset. 82 * @param date date to convert 83 * @return relative offset 84 */ 85 public double offset(final AbsoluteDate date) { 86 return date.durationFrom(referenceDate); 87 } 88 89 /** Get the base time scale. 90 * @return base time scale 91 */ 92 public TimeScale getTimeScale() { 93 return timeScale; 94 } 95 96 /** Get the reference date for relative dates (may be null if no relative dates are used). 97 * @return reference date for relative dates (may be null if no relative dates are used) 98 * @since 12.0 99 */ 100 public AbsoluteDate getReferenceDate() { 101 return referenceDate; 102 } 103 104 }