def testFracSecs(self): ts = DateTime("2004-03-01T12:39:45.1Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '2004-03-01T12:39:45.100000000Z') ts = DateTime("2004-03-01T12:39:45.01Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '2004-03-01T12:39:45.010000000Z') ts = DateTime("2004-03-01T12:39:45.000000001Z", DateTime.UTC) # nanosecond self.assertEqual(ts.toString(ts.UTC), '2004-03-01T12:39:45.000000001Z') ts = DateTime("2004-03-01T12:39:45.0000000001Z", DateTime.UTC) # too small self.assertEqual(ts.toString(ts.UTC), '2004-03-01T12:39:45.000000000Z')
def testIsoThrow(self): with self.assertRaises(pexExcept.DomainError): DateTime("2009-04-01T23:36:05", DateTime.UTC) # Z time zone required for UTC for scale in (DateTime.TAI, DateTime.TT): with self.assertRaises(pexExcept.DomainError): DateTime("2009-04-01T23:36:05Z", scale) # Z time zone forbidden for TAI or TT for scale in self.timeScales: with self.assertRaises(pexExcept.DomainError): DateTime("20090401", scale) # time required with self.assertRaises(pexExcept.DomainError): DateTime("20090401T", DateTime.UTC) # time required with self.assertRaises(pexExcept.DomainError): DateTime("2009-04-01T", DateTime.UTC) # time required with self.assertRaises(pexExcept.DomainError): DateTime("2009-04-01T23:36:05-0700", DateTime.UTC) # time zone offset not supported with self.assertRaises(pexExcept.DomainError): DateTime("2009/04/01T23:36:05Z", DateTime.UTC) # "/" not valid with self.assertRaises(pexExcept.DomainError): DateTime("2009-04-01T23:36", DateTime.UTC) # partial time with self.assertRaises(pexExcept.DomainError): DateTime("2009-04", DateTime.UTC) # partial date without time with self.assertRaises(pexExcept.DomainError): DateTime("2009-04T23:36.05", DateTime.UTC) # partial date with time with self.assertRaises(pexExcept.DomainError): DateTime("09-04-01T23:36:05", DateTime.UTC) # 2 digit year # earliest allowed UTC date is the earliest date in the leap second table try: minLeapSecUTC = "1961-01-01T00:00:00Z" dt = DateTime(minLeapSecUTC, DateTime.UTC) dt.toString(DateTime.UTC) except Exception: self.fail("minLeapSecUTC={} failed, but should be OK".format(minLeapSecUTC)) with self.assertRaises(pexExcept.DomainError): DateTime("1960-01-01T23:59:59Z", DateTime.UTC) # just before leap second table starts # earliest allowed date for TAI and TT is year = 1902 for timeSys in (DateTime.TAI, DateTime.TT): try: earliestDate = "1902-01-01T00:00:00" dt = DateTime(earliestDate, timeSys) dt.toString(DateTime.TAI) dt.toString(DateTime.TT) except Exception: self.fail("{} system={} failed, but should be OK".format(earliestDate, timeSys)) # dates before the leap second table can be created using TAI or TT, but not viewed in UTC earlyDt = DateTime("1960-01-01T00:00:00", DateTime.TAI) with self.assertRaises(pexExcept.DomainError): earlyDt.toString(DateTime.UTC) with self.assertRaises(pexExcept.DomainError): DateTime("1901-12-12T23:59:59Z", DateTime.TAI) # too early with self.assertRaises(pexExcept.DomainError): DateTime("1700-01-01T00:00:00Z", DateTime.TAI) # way too early with self.assertRaises(pexExcept.DomainError): DateTime("2262-01-01T00:00:00Z", DateTime.TAI) # too late with self.assertRaises(pexExcept.DomainError): DateTime("3200-01-01T00:00:00Z", DateTime.TAI) # way too late
def testInvalid(self): ts = DateTime() self.assertFalse(ts.isValid()) for scale in self.timeScales: self.assertEqual(ts.nsecs(scale), DateTime.invalid_nsecs) for system in self.dateSystems: with self.assertRaises(pexExcept.RuntimeError): ts.get(system, scale) with self.assertRaises(pexExcept.RuntimeError): ts.gmtime(scale) with self.assertRaises(pexExcept.RuntimeError): ts.timespec(scale) with self.assertRaises(pexExcept.RuntimeError): ts.timeval(scale) with self.assertRaises(pexExcept.RuntimeError): ts.toString(scale) self.assertEqual(repr(ts), "DateTime()")
def testInvalid(self): ts = DateTime() self.assertFalse(ts.isValid()) for scale in self.timeScales: self.assertEqual(ts.nsecs(scale), DateTime.invalid_nsecs) for system in self.dateSystems: with self.assertRaises(RuntimeError): ts.get(system, scale) with self.assertRaises(RuntimeError): ts.gmtime(scale) with self.assertRaises(RuntimeError): ts.timespec(scale) with self.assertRaises(RuntimeError): ts.timeval(scale) with self.assertRaises(RuntimeError): ts.toString(scale) self.assertEqual(repr(ts), "DateTime()")
def testIsoNonUTCBasics(self): """Test basic ISO string input and output of TAI and TT dates""" for scale in (DateTime.TAI, DateTime.TT): for dateSep in ("-", ""): # "-" date separator is optional for timeSep in (":", ""): # ":" time separator is optional for decPt in (".", ","): # "." or "," may be used as decimal point dateStr = "2009{0}04{0}02T07{1}26{1}39{2}314159265".format(dateSep, timeSep, decPt) ts = DateTime(dateStr, scale) self.assertEqual(ts.toString(scale), "2009-04-02T07:26:39.314159265") self.assertTrue(ts.isValid())
def testIsoUTCBasic(self): """Test basic ISO string input and output of UTC dates""" for dateSep in ("-", ""): # "-" date separator is optional for timeSep in (":", ""): # ":" time separator is optional for decPt in (".", ","): # "." or "," may be used as decimal point dateStr = "2009{0}04{0}02T07{1}26{1}39{2}314159265Z".format(dateSep, timeSep, decPt) ts = DateTime(dateStr, DateTime.UTC) self.assertEqual(ts.nsecs(DateTime.TT), 1238657265498159265) self.assertEqual(ts.nsecs(DateTime.TAI), 1238657233314159265) self.assertEqual(ts.nsecs(DateTime.UTC), 1238657199314159265) self.assertEqual(ts.toString(ts.UTC), "2009-04-02T07:26:39.314159265Z")
def testIsoNonUTCBasics(self): """Test basic ISO string input and output of TAI and TT dates """ for scale in (DateTime.TAI, DateTime.TT): for dateSep in ("-", ""): # "-" date separator is optional for timeSep in (":", ""): # ":" time separator is optional for decPt in (".", ","): # "." or "," may be used as decimal point dateStr = "2009{0}04{0}02T07{1}26{1}39{2}314159265".format(dateSep, timeSep, decPt) ts = DateTime(dateStr, scale) self.assertEqual(ts.toString(scale), "2009-04-02T07:26:39.314159265") self.assertTrue(ts.isValid())
def testIsoUTCBasic(self): """Test basic ISO string input and output of UTC dates """ for dateSep in ("-", ""): # "-" date separator is optional for timeSep in (":", ""): # ":" time separator is optional for decPt in (".", ","): # "." or "," may be used as decimal point dateStr = "2009{0}04{0}02T07{1}26{1}39{2}314159265Z".format(dateSep, timeSep, decPt) ts = DateTime(dateStr, DateTime.UTC) self.assertEqual(ts.nsecs(DateTime.TT), 1238657265498159265) self.assertEqual(ts.nsecs(DateTime.TAI), 1238657233314159265) self.assertEqual(ts.nsecs(DateTime.UTC), 1238657199314159265) self.assertEqual(ts.toString(ts.UTC), "2009-04-02T07:26:39.314159265Z")
def saveVisit(self, visitId: int, visitTime: DateTime, lastObjectId: int, lastSourceId: int) -> None: """Store visit information. Parameters ---------- visitId : `int` Visit identifier visitTime : `datetime.datetime` Visit timestamp. lastObjectId : `int` Highest existing DIAObject ID lastSourceId : `int` Highest existing DIASource ID """ with open(self.path, "w") as file: isoTime = visitTime.toString(DateTime.TAI) file.write(f"{visitId} {isoTime} {lastObjectId} {lastSourceId}")
def testNegative(self): ts = DateTime("1969-03-01T00:00:32Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-03-01T00:00:32.000000000Z') ts = DateTime("1969-01-01T00:00:00Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-01-01T00:00:00.000000000Z') ts = DateTime("1969-01-01T00:00:40Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-01-01T00:00:40.000000000Z') ts = DateTime("1969-01-01T00:00:38Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-01-01T00:00:38.000000000Z') ts = DateTime("1969-03-01T12:39:45Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-03-01T12:39:45.000000000Z') ts = DateTime("1969-03-01T12:39:45.000000001Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-03-01T12:39:45.000000001Z') self.assertTrue(ts.isValid()) # Note slight inaccuracy in UTC-TAI-UTC round-trip ts = DateTime("1969-03-01T12:39:45.12345Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-03-01T12:39:45.123449996Z') ts = DateTime("1969-03-01T12:39:45.123456Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-03-01T12:39:45.123455996Z') ts = DateTime(-1, DateTime.TAI) self.assertEqual(ts.toString(ts.UTC), '1969-12-31T23:59:51.999918239Z') ts = DateTime(0, DateTime.TAI) self.assertEqual(ts.toString(ts.UTC), '1969-12-31T23:59:51.999918240Z') ts = DateTime(1, DateTime.TAI) self.assertEqual(ts.toString(ts.UTC), '1969-12-31T23:59:51.999918241Z') ts = DateTime(-1, DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-12-31T23:59:59.999999999Z') ts = DateTime(0, DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1970-01-01T00:00:00.000000000Z') ts = DateTime(1, DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1970-01-01T00:00:00.000000001Z')
def testMakeRawVisitInfo(self): """Test base class functor MakeRawVisitInfo The base class only sets date and exposureTime fields, reads DATE-OBS, TIMESYS and EXPTIME, and deletes DATE-OBS and EXPTIME, but not TIMESYS. """ exposureTime = 6.2 # arbitrary value in seconds date = DateTime("2001-01-02T03:04:05.123456789", DateTime.TAI) dateNsec = date.nsecs(DateTime.TAI) startDate = DateTime(dateNsec - int(exposureTime*1e9/2), DateTime.TAI) exposureId = 54321 # an arbitrary value md = getMetadata({ "DATE-OBS": startDate.toString(DateTime.UTC), "TIMESYS": "UTC", "EXPTIME": exposureTime, "EXTRA1": "an abitrary key and value", "EXTRA2": 5, }) length = len(md) visitInfo = self.makeRawVisitInfo(md=md, exposureId=exposureId) self.assertEqual(visitInfo.getExposureId(), exposureId) self.assertEqual(md.nameCount(), length) # No stripping self.assertEqual(visitInfo.getExposureTime(), exposureTime) self.assertEqual(visitInfo.getDate(), date) # Test stripping keywords visitInfo = SimpleMakeRawVisitInfo(doStripHeader=True)(md=md, exposureId=exposureId) self.assertEqual(md.nameCount(), 3) # TIMESYS and two EXTRAn keywords # try TIMESYS=TAI md = getMetadata({ "DATE-OBS": startDate.toString(DateTime.TAI), "TIMESYS": "TAI", "EXPTIME": exposureTime, }) length = len(md) visitInfo = self.makeRawVisitInfo(md=md, exposureId=exposureId) self.assertEqual(md.nameCount(), length) self.assertEqual(visitInfo.getExposureTime(), exposureTime) self.assertEqual(visitInfo.getDate(), date) # try omitting TIMESYS, which defaults to UTC md = getMetadata({ "DATE-OBS": startDate.toString(DateTime.UTC), "EXPTIME": exposureTime, }) length = len(md) visitInfo = self.makeRawVisitInfo(md=md, exposureId=exposureId) self.assertEqual(md.nameCount(), length) self.assertEqual(visitInfo.getExposureTime(), exposureTime) self.assertEqual(visitInfo.getDate(), date) # omit DATE-OBS; date should be default-constructed md = getMetadata({ "EXPTIME": exposureTime, }) length = len(md) visitInfo = self.makeRawVisitInfo(md=md, exposureId=exposureId) self.assertEqual(md.nameCount(), length) self.assertEqual(visitInfo.getExposureTime(), exposureTime) self.assertEqual(visitInfo.getDate(), DateTime()) # omit EXPTIME; date should be start date, not avg date, and # exposureTime should be nan md = getMetadata({ "DATE-OBS": startDate.toString(DateTime.UTC), }) length = len(md) visitInfo = self.makeRawVisitInfo(md=md, exposureId=exposureId) self.assertEqual(md.nameCount(), length) self.assertTrue(math.isnan(visitInfo.getExposureTime())) self.assertEqual(visitInfo.getDate(), startDate)
def testIsoEpoch(self): ts = DateTime("19700101T000000Z", DateTime.UTC) self.assertEqual(ts.nsecs(DateTime.UTC), long(0)) self.assertEqual(ts.toString(ts.UTC), "1970-01-01T00:00:00.000000000Z")
def testIsoBasic(self): ts = DateTime("20090402T072639.314159265Z") self.assertEqual(ts.nsecs(DateTime.TAI), 1238657233314159265L) self.assertEqual(ts.nsecs(DateTime.UTC), 1238657199314159265L) self.assertEqual(ts.toString(), "2009-04-02T07:26:39.314159265Z")
def testIsoNoNSecs(self): ts = DateTime("2009-04-02T07:26:39Z", DateTime.UTC) self.assertEqual(ts.nsecs(DateTime.TAI), 1238657233000000000) self.assertEqual(ts.nsecs(DateTime.UTC), 1238657199000000000) self.assertEqual(ts.toString(ts.UTC), "2009-04-02T07:26:39.000000000Z") self.assertTrue(ts.isValid())
def testIsoExpanded(self): ts = DateTime("2009-04-02T07:26:39.314159265Z", DateTime.UTC) self.assertEqual(ts.nsecs(DateTime.TAI), long(1238657233314159265)) self.assertEqual(ts.nsecs(DateTime.UTC), long(1238657199314159265)) self.assertEqual(ts.toString(ts.UTC), "2009-04-02T07:26:39.314159265Z") self.assertTrue(ts.isValid())
def testIsoExpanded(self): ts = DateTime("2009-04-02T07:26:39.314159265Z", DateTime.UTC) self.assertEqual(ts.nsecs(DateTime.TAI), 1238657233314159265) self.assertEqual(ts.nsecs(DateTime.UTC), 1238657199314159265) self.assertEqual(ts.toString(ts.UTC), "2009-04-02T07:26:39.314159265Z") self.assertTrue(ts.isValid())
def testIsoNoNSecs(self): ts = DateTime("2009-04-02T07:26:39Z", DateTime.UTC) self.assertEqual(ts.nsecs(DateTime.TAI), long(1238657233000000000)) self.assertEqual(ts.nsecs(DateTime.UTC), long(1238657199000000000)) self.assertEqual(ts.toString(ts.UTC), "2009-04-02T07:26:39.000000000Z") self.assertTrue(ts.isValid())
def testIsoThrow(self): with self.assertRaises(pexExcept.DomainError): DateTime("2009-04-01T23:36:05", DateTime.UTC) # Z time zone required for UTC for scale in (DateTime.TAI, DateTime.TT): with self.assertRaises(pexExcept.DomainError): DateTime("2009-04-01T23:36:05Z", scale) # Z time zone forbidden for TAI or TT for scale in self.timeScales: with self.assertRaises(pexExcept.DomainError): DateTime("20090401", scale) # time required with self.assertRaises(pexExcept.DomainError): DateTime("20090401T", DateTime.UTC) # time required with self.assertRaises(pexExcept.DomainError): DateTime("2009-04-01T", DateTime.UTC) # time required with self.assertRaises(pexExcept.DomainError): DateTime("2009-04-01T23:36:05-0700", DateTime.UTC) # time zone offset not supported with self.assertRaises(pexExcept.DomainError): DateTime("2009/04/01T23:36:05Z", DateTime.UTC) # "/" not valid with self.assertRaises(pexExcept.DomainError): DateTime("2009-04-01T23:36", DateTime.UTC) # partial time with self.assertRaises(pexExcept.DomainError): DateTime("2009-04", DateTime.UTC) # partial date without time with self.assertRaises(pexExcept.DomainError): DateTime("2009-04T23:36.05", DateTime.UTC) # partial date with time with self.assertRaises(pexExcept.DomainError): DateTime("09-04-01T23:36:05", DateTime.UTC) # 2 digit year # earliest allowed UTC date is the earliest date in the leap second table try: minLeapSecUTC = "1961-01-01T00:00:00Z" dt = DateTime(minLeapSecUTC, DateTime.UTC) dt.toString(DateTime.UTC) except Exception: self.fail("minLeapSecUTC={} failed, but should be OK".format( minLeapSecUTC)) with self.assertRaises(pexExcept.DomainError): DateTime("1960-01-01T23:59:59Z", DateTime.UTC) # just before leap second table starts # earliest allowed date for TAI and TT is year = 1902 for timeSys in (DateTime.TAI, DateTime.TT): try: earliestDate = "1902-01-01T00:00:00" dt = DateTime(earliestDate, timeSys) dt.toString(DateTime.TAI) dt.toString(DateTime.TT) except Exception: self.fail("{} system={} failed, but should be OK".format( earliestDate, timeSys)) # dates before the leap second table can be created using TAI or TT, but not viewed in UTC earlyDt = DateTime("1960-01-01T00:00:00", DateTime.TAI) with self.assertRaises(pexExcept.DomainError): earlyDt.toString(DateTime.UTC) with self.assertRaises(pexExcept.DomainError): DateTime("1901-12-12T23:59:59Z", DateTime.TAI) # too early with self.assertRaises(pexExcept.DomainError): DateTime("1700-01-01T00:00:00Z", DateTime.TAI) # way too early with self.assertRaises(pexExcept.DomainError): DateTime("2262-01-01T00:00:00Z", DateTime.TAI) # too late with self.assertRaises(pexExcept.DomainError): DateTime("3200-01-01T00:00:00Z", DateTime.TAI) # way too late
def testIsoEpoch(self): ts = DateTime("19700101T000000Z", DateTime.UTC) self.assertEqual(ts.nsecs(DateTime.UTC), 0) self.assertEqual(ts.toString(ts.UTC), "1970-01-01T00:00:00.000000000Z")
def testNegative(self): ts = DateTime("1969-03-01T00:00:32Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-03-01T00:00:32.000000000Z') ts = DateTime("1969-01-01T00:00:00Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-01-01T00:00:00.000000000Z') ts = DateTime("1969-01-01T00:00:40Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-01-01T00:00:40.000000000Z') ts = DateTime("1969-01-01T00:00:38Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-01-01T00:00:38.000000000Z') ts = DateTime("1969-03-01T12:39:45Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-03-01T12:39:45.000000000Z') ts = DateTime("1969-03-01T12:39:45.000000001Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-03-01T12:39:45.000000001Z') self.assertTrue(ts.isValid()) # Note slight inaccuracy in UTC-TAI-UTC round-trip ts = DateTime("1969-03-01T12:39:45.12345Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-03-01T12:39:45.123449996Z') ts = DateTime("1969-03-01T12:39:45.123456Z", DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-03-01T12:39:45.123455996Z') ts = DateTime(long(-1), DateTime.TAI) self.assertEqual(ts.toString(ts.UTC), '1969-12-31T23:59:51.999918239Z') ts = DateTime(long(0), DateTime.TAI) self.assertEqual(ts.toString(ts.UTC), '1969-12-31T23:59:51.999918240Z') ts = DateTime(long(1), DateTime.TAI) self.assertEqual(ts.toString(ts.UTC), '1969-12-31T23:59:51.999918241Z') ts = DateTime(long(-1), DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1969-12-31T23:59:59.999999999Z') ts = DateTime(long(0), DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1970-01-01T00:00:00.000000000Z') ts = DateTime(long(1), DateTime.UTC) self.assertEqual(ts.toString(ts.UTC), '1970-01-01T00:00:00.000000001Z')