🛰️航天仿真算法库 SpaceAST 0.3.1
载入中...
搜索中...
未找到
TimePoint.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "Duration.hpp" // for LongDuration
25#include "AstUtil/Constants.hpp" // for kJ2000XXXX
26#include "AstCore/JulianDate.hpp"
27#include "AstCore/DateTime.hpp"
28#include "AstCore/RunTime.hpp"
29#include "AstUtil/StringView.hpp"
30#include <stdint.h> // for int64_t
31#include <cmath> // for std::isnan
32
33AST_NAMESPACE_BEGIN
34
42class DateTime;
43
44class LongDuration;
45class ShortDuration;
46class DaySecDuration;
47
48class TAIScale;
49class TDBScale;
50class TTScale;
51class UTCScale;
52
53class TimePoint;
54
55constexpr static int kTimePointDefaultFormatPrecision = 6;
56
57
58// --------------------
59// 时间点与时间系统的转换
60// --------------------
61
63AST_CORE_API void aTimePointToUTC(const TimePoint& time, JulianDate& jdUTC);
64
66AST_CORE_API void aTimePointToTT(const TimePoint& time, JulianDate& jdTT);
67
69AST_CORE_API void aTimePointToTDB(const TimePoint& time, JulianDate& jdTDB);
70
72AST_CORE_API void aTimePointToTAI(const TimePoint& time, JulianDate& jdTAI);
73
75AST_CORE_API void aTimePointToUT1(const TimePoint& time, JulianDate& jdUT1);
76
78AST_CORE_API void aTimePointToUTC(const TimePoint& time, DateTime& dttmUTC);
79
81AST_CORE_API void aTimePointToTT(const TimePoint& time, DateTime& dttmTT);
82
84AST_CORE_API void aTimePointToTDB(const TimePoint& time, DateTime& dttmTDB);
85
87AST_CORE_API void aTimePointToTAI(const TimePoint& time, DateTime& dttmTAI);
88
90AST_CORE_API void aTimePointToUT1(const TimePoint& time, DateTime& dttmUT1);
91
92
93
94// ----------------
95// 时间点格式化与解析
96// ----------------
97
98
100AST_CORE_CAPI errc_t aTimePointFormat(const TimePoint& time, std::string& str, int precision = kTimePointDefaultFormatPrecision);
101
103AST_CORE_CAPI errc_t aTimePointParse(StringView str, TimePoint& time);
104
105
108{
109public:
111 AST_CORE_API
112 static TimePoint Default();
113
116 AST_CORE_API
117 static TimePoint NaN();
118
121 AST_CORE_API
122 static TimePoint Epoch();
123
125 AST_CORE_API
126 static TimePoint CurrentTime();
127
129 AST_CORE_API
130 static TimePoint TodayUTC();
131
133 AST_CORE_API
134 static TimePoint TomorrowUTC();
135
137 AST_CORE_API
138 static TimePoint FromUTC(int year, int month, int day, int hour, int minute, double second);
139
141 AST_CORE_API
142 static TimePoint FromUTC(const DateTime& dttmUTC);
143
147 AST_CORE_API
148 static TimePoint FromYD(int year, double dayOfYear);
149
153 AST_CORE_API
154 static TimePoint FromTLEYD(double tleYD);
155
157 AST_CORE_API
158 static TimePoint FromBJT(const DateTime& dttmBJT);
159
161 AST_CORE_API
162 static TimePoint FromTAI(const DateTime& dttmTAI);
163
165 AST_CORE_API
166 static TimePoint FromTAI(const JulianDate& jdTAI);
167
169 AST_CORE_API
170 static TimePoint FromTT(const JulianDate& jdTT);
171
172 AST_CORE_API
173 static TimePoint FromTT(const DateTime& dttmTT);
174
176 AST_CORE_API
177 static TimePoint FromTDB(const JulianDate& jdTDB);
178
180 AST_CORE_API
181 static TimePoint FromImpreciseJDTT(double jdTT);
182
185 return {0, -kTTMinusTAI};
186 }
187
191 AST_CORE_API
192 static TimePoint Parse(StringView str);
193
195 AST_CORE_API
196 static TimePoint ParseUTC(StringView str);
197
199 AST_CORE_API
200 static TimePoint ParseBJT(StringView str);
201public:
203 int64_t integerPart() const { return duration_.integer_; }
204
206 double fractionalPart() const { return duration_.fractional_; }
207public:
209 bool isInf() const{return std::isinf(duration_.fractional_);}
210
212 bool isNaN() const { return std::isnan(duration_.fractional_); }
213
215 bool isValid() const { return !isNaN(); }
216public:
218 double daysFromJ2000TT() const{
219 return ((double)integerPart() / kSecondsPerDay) + (fractionalPart() + kTTMinusTAI) / kSecondsPerDay;
220 }
221
224 return daysFromJ2000TT() / kDaysPerJulianCentury;
225 }
226
228 void toTT(JulianDate& jdTT) const{
229 aTimePointToTT(*this, jdTT);
230 }
233 JulianDate jdTT;
234 toTT(jdTT);
235 return jdTT;
236 }
238 void toTDB(JulianDate& jdTDB) const{
239 aTimePointToTDB(*this, jdTDB);
240 }
243 JulianDate jdTDB;
244 toTDB(jdTDB);
245 return jdTDB;
246 }
248 void toTAI(JulianDate& jdTAI) const{
249 aTimePointToTAI(*this, jdTAI);
250 }
253 JulianDate jdTAI;
254 toTAI(jdTAI);
255 return jdTAI;
256 }
258 double toEpochSecond() const{
259 return aTimePointToEpochSecond(*this);
260 }
261
263 double durationFrom(const TimePoint& other) const{
264 return duration_.minusInSecond(other.duration_);
265 }
266
268 double daysFrom(const TimePoint& other) const{
269 return duration_.minusInDay(other.duration_);
270 }
271
272public:
273 // ————————————————————————
274 // 运算符重载
275 // ————————————————————————
276
277 double operator-(const TimePoint& other) const { return durationFrom(other); }
278 TimePoint operator+(double second) const { return {integerPart(), fractionalPart() + second}; }
279 TimePoint operator-(double second) const { return {integerPart(), fractionalPart() - second}; }
280 TimePoint& operator+=(double second) { duration_.fractional_ += second; return *this; }
281 TimePoint& operator-=(double second) { duration_.fractional_ -= second; return *this; }
282 bool operator==(const TimePoint& other) const { return durationFrom(other) == 0.0; }
283 bool operator!=(const TimePoint& other) const { return durationFrom(other) != 0.0; }
284 bool operator>(const TimePoint& other) const { return durationFrom(other) > 0.0; }
285 bool operator<(const TimePoint& other) const { return durationFrom(other) < 0.0; }
286 bool operator>=(const TimePoint& other) const { return durationFrom(other) >= 0.0; }
287 bool operator<=(const TimePoint& other) const { return durationFrom(other) <= 0.0; }
288
289public:
290
294 std::string toString(int precision = kTimePointDefaultFormatPrecision) const
295 {
296 std::string str;
297 aTimePointFormat(*this, str, precision);
298 return str;
299 }
300public:
304 TimePoint shiftedBySecond(double second) const{
305 return {integerPart(), fractionalPart() + second};
306 }
307
311 AST_CORE_API TimePoint shiftedBySecondInTDB(double second) const;
312
313protected:
314 static TimePoint FromIntegerFractional(int64_t integer, double fractional);
315public:
316 LongDuration duration_;
317};
318
319
321inline TimePoint operator ""_utc(const char* str, size_t len)
322{
323 return TimePoint::ParseUTC(StringView(str, len));
324}
325
327inline TimePoint operator ""_bjt(const char* str, size_t len)
328{
329 return TimePoint::ParseBJT(StringView(str, len));
330}
331
333inline TimePoint operator ""_timepoint(const char* str, size_t len)
334{
335 return TimePoint::Parse(StringView(str, len));
336}
337
338// typedef TimePoint<TDBScale, LongDuration> TDBTime;
339// typedef TimePoint<TTScale, LongDuration> TTTime;
340// typedef TimePoint<UTCScale, LongDuration> UTCTime;
341// typedef TimePoint<TAIScale, LongDuration> TAITime;
342
343// typedef TAITime AbsTime;
344// typedef TAITime AstTime;
345
346
349AST_NAMESPACE_END
long int integer
定义 MockSnopt.c:24
日期时间
定义 DateTime.hpp:420
儒略日
定义 JulianDate.hpp:86
长时长
定义 Duration.hpp:49
绝对时间点
定义 TimePoint.hpp:108
JulianDate toTAI() const
将时间点转换为儒略日数(原子时 TAI)
定义 TimePoint.hpp:252
double julianCenturyFromJ2000TT() const
计算时间点与 J2000 epoch 的时间差(儒略世纪)
定义 TimePoint.hpp:223
bool isInf() const
是否为无穷大/无穷小时间点
定义 TimePoint.hpp:209
TimePoint shiftedBySecond(double second) const
计算时间点偏移后的新时间点,按默认时间尺度进行时间偏移
定义 TimePoint.hpp:304
static TimePoint J2000TT()
J2000.0 TT 时间点
定义 TimePoint.hpp:184
double fractionalPart() const
时间点的小数秒数部分
定义 TimePoint.hpp:206
double durationFrom(const TimePoint &other) const
计算与另一个时间点的时间差(秒数)
定义 TimePoint.hpp:263
bool isNaN() const
是否为“无数据/非法”时间点
定义 TimePoint.hpp:212
void toTT(JulianDate &jdTT) const
将时间点转换为儒略日数(地球时TT)
定义 TimePoint.hpp:228
void toTDB(JulianDate &jdTDB) const
将时间点转换为儒略日数(质心动力学时TDB)
定义 TimePoint.hpp:238
double toEpochSecond() const
将时间点转换为相对于参考历元的秒数
定义 TimePoint.hpp:258
JulianDate toTT() const
将时间点转换为儒略日数(地球时TT)
定义 TimePoint.hpp:232
double daysFromJ2000TT() const
计算时间点与 J2000 epoch 的时间差(天)
定义 TimePoint.hpp:218
bool isValid() const
是否为有效时间点
定义 TimePoint.hpp:215
int64_t integerPart() const
时间点的整数秒数部分
定义 TimePoint.hpp:203
JulianDate toTDB() const
将时间点转换为儒略日数(质心动力学时TDB)
定义 TimePoint.hpp:242
std::string toString(int precision=kTimePointDefaultFormatPrecision) const
将时间点格式化为字符串
定义 TimePoint.hpp:294
double daysFrom(const TimePoint &other) const
计算与另一个时间点的时间差(天)
定义 TimePoint.hpp:268
void toTAI(JulianDate &jdTAI) const
将时间点转换为儒略日数(原子时 TAI)
定义 TimePoint.hpp:248
double aTimePointToEpochSecond(const TimePoint &tp)
将时间点转换为相对参考历元的秒数
定义 RunTimeEpoch.cpp:27
void aTimePointToTAI(const TimePoint &time, JulianDate &jdTAI)
将时间点转换为儒略日数(原子时 TAI)
定义 TimePoint.cpp:61
errc_t aTimePointFormat(const TimePoint &time, std::string &str, int precision)
将时间点格式化为字符串
定义 TimePoint.cpp:119
void aTimePointToTDB(const TimePoint &time, DateTime &dttmTDB)
将时间点转换为日期时间(质心动力学时TDB)
定义 TimePoint.cpp:94
void aTimePointToUTC(const TimePoint &time, JulianDate &jdUTC)
将时间点转换为儒略日数(协调世界时 UTC)
定义 TimePoint.cpp:43
void aTimePointToUT1(const TimePoint &time, JulianDate &jdUT1)
将时间点转换为儒略日数(世界时 UT1)
定义 TimePoint.cpp:72
void aTimePointToTT(const TimePoint &time, JulianDate &jdTT)
将时间点转换为儒略日数(地球时TT)
定义 TimePoint.cpp:49
errc_t aTimePointParse(StringView str, TimePoint &time)
从字符串解析时间点
定义 TimePoint.cpp:151
constexpr double kSecondsPerDay
一天的秒数
定义 Constants.hpp:237
constexpr double kDaysPerJulianCentury
儒略世纪天数
定义 Constants.hpp:235
constexpr double kTTMinusTAI
地球时相对原子时的偏置[s]
定义 Constants.hpp:46
Unit minute
分钟,不要命名为min,容易与std::min冲突
定义 Unit.cpp:467
Unit day
天
定义 Unit.cpp:470
Unit hour
小时
定义 Unit.cpp:468