#!/usr/bin/env python3 # -*- coding: utf8 -*- from datetime import datetime import astropy.units as u from astropy.time.formats import erfa from astropy.time import Time from astropy.time import TimezoneInfo MJDREF = Time(51543.875, format='mjd') #corresponds to date 01.01.2000 00:00:00 (UTC+3) TZ_UTC = TimezoneInfo(utc_offset=0*u.hour) #UTC time zone TZ_MSK = TimezoneInfo(utc_offset=3*u.hour) #UTC+3 (Moscow) time zone from pkg_resources import get_distribution, DistributionNotFound try: __version__ = get_distribution(__name__).version except DistributionNotFound: pass # package is not installed class MissionTime(object): def __init__(self, mtime): self._mtime = mtime def get(self): return self._mtime def __str__(self): return str(self._mtime) def to_datetime(self, tzone=TZ_UTC): days = self.to_mjd() return days.to_datetime(timezone=tzone) def to_artday(self): ARTDAYLEN = erfa.DAYSEC return self._mtime / ARTDAYLEN def to_mjd(self): mjd_value = MJDREF.mjd + Time(self._mtime / erfa.DAYSEC, format='mjd').mjd return Time(mjd_value, format='mjd') class ArtDay(object): def __init__(self, aday): self._aday = aday def get(self): return self._aday def __str__(self): return str(self._aday) def to_mission(self): ARTDAYLEN = erfa.DAYSEC return self._aday * ARTDAYLEN def to_datetime(self, tzone=TZ_UTC): days = self.to_mjd() return days.to_datetime(timezone=tzone) def to_mjd(self): mjd_value = MJDREF.mjd + Time(self._aday, format='mjd').mjd return Time(mjd_value, format='mjd') class MjdDay(object): def __init__(self, mjd): self._mjd = Time(mjd, format='mjd') def get(self): return self._mjd def __str__(self): return str(self._mjd) def to_mission(self): ARTDAYLEN = erfa.DAYSEC return (self._mjd.mjd - MJDREF.mjd) * ARTDAYLEN def to_artday(self): return self._mjd.mjd - MJDREF.mjd def to_datetime(self, tzone=TZ_UTC): return Time(self._mjd, format='mjd').to_datetime(timezone=tzone) class Dtime(object): def __init__(self, dtime, tzone=None): dtime = datetime.fromisoformat(dtime) if tzone is None: self._dtime = dtime else: self._dtime = dtime.replace(tzinfo=tzone) self._tzone = tzone def get(self): return self._dtime def __str__(self): return str(self._dtime) def to_mjd(self): days = Time(self._dtime) return days def to_artday(self): return self.to_mjd().mjd - MJDREF.mjd def to_mission(self): ARTDAYLEN = erfa.DAYSEC return self.to_artday() * ARTDAYLEN def to_msk(self): dtime_utc = Time(self._dtime) return dtime_utc.to_datetime(timezone=TZ_MSK) def to_utc(self): dtime_msk = Time(self._dtime) return dtime_msk.to_datetime(timezone=TZ_UTC) class ArtTime(object): def __init__(self, aday=None, mjd=None, mtime=None, dtime_utc=None, dtime_msk=None): self._has_value = False self._try_mtime(mtime) self._try_aday(aday) self._try_mjd(mjd) self._try_dtime_utc(dtime_utc) self._try_dtime_msk(dtime_msk) def _try_mtime(self, mtime): if mtime is None: return self._has_value = True self._mtime = MissionTime(mtime) self._aday = ArtDay(self._mtime.to_artday()) self._mjd = MjdDay(self._mtime.to_mjd()) self._dtime_utc = Dtime(dtime=str(self._mtime.to_datetime(tzone=TZ_UTC))) self._dtime_msk = Dtime(dtime=str(self._mtime.to_datetime(tzone=TZ_MSK))) def _try_aday(self, aday): if aday is None: return self._has_value = True self._aday = ArtDay(aday) self._mtime = MissionTime(self._aday.to_mission()) self._mjd = MjdDay(self._aday.to_mjd()) self._dtime_utc = Dtime(dtime=str(self._aday.to_datetime(tzone=TZ_UTC))) self._dtime_msk = Dtime(dtime=str(self._aday.to_datetime(tzone=TZ_MSK))) def _try_mjd(self, mjd): if mjd is None: return self._has_value = True self._mjd = MjdDay(mjd) self._aday = ArtDay(self._mjd.to_artday()) self._mtime = MissionTime(self._mjd.to_mission()) self._dtime_utc = Dtime(dtime=str(self._mjd.to_datetime(tzone=TZ_UTC))) self._dtime_msk = Dtime(dtime=str(self._mjd.to_datetime(tzone=TZ_MSK))) def _try_dtime_utc(self, dtime_utc): if dtime_utc is None: return self._has_value = True self._dtime_utc = Dtime(dtime_utc, tzone=TZ_UTC) self._dtime_msk = Dtime(str(self._dtime_utc.to_msk())) self._mtime = MissionTime(self._dtime_utc.to_mission()) self._aday = ArtDay(self._dtime_utc.to_artday()) self._mjd = MjdDay(self._dtime_utc.to_mjd()) def _try_dtime_msk(self, dtime_msk): if dtime_msk is None: return self._has_value = True self._dtime_msk = Dtime(dtime_msk, tzone=TZ_MSK) self._dtime_utc = Dtime(str(self._dtime_msk.to_utc())) self._mtime = MissionTime(self._dtime_msk.to_mission()) self._aday = ArtDay(self._dtime_msk.to_artday()) self._mjd = MjdDay(self._dtime_msk.to_mjd()) # def valid(self): # return self._has_value @property def mission(self): return self._mtime @property def artday(self): return self._aday @property def mjd(self): return self._mjd @property def date_utc(self): return self._dtime_utc @property def date_msk(self): return self._dtime_msk def __str__(self): print('Artday --> ', self._aday) print('Mission time --> ', self._mtime) print('MJD --> ', self._mjd) print('Date MSK --> ', self._dtime_msk) print('Date UTC --> ', self._dtime_utc) return str(self._mtime) def main(): mtime = 692659102.9999999 aday = 8016.887708333336 utc = 1639322302.999999 dtime = '2021-12-12T18:18:23' mjd = 59560.762708333335 # 692582400.0 # 8016 # 2021-12-11 21:00:00+00:00 # 2021-12-12 00:00:00+03:00 # 59559.875 # Parameters: dtime_msk, dtime_utc, mtime, aday, mjd. # ArtTime converts the given parameter into all others. atime = ArtTime(dtime_msk='2021-12-12T00:00:00') print(atime) print(atime.mission) print(atime.artday) print(atime.date_utc) print(atime.date_msk) print(atime.mjd) if __name__ == '__main__': __version__ = '1.0' main()