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')
Example #2
0
 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
Example #4
0
 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")
Example #8
0
 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())
Example #9
0
 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")
Example #10
0
    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)
Example #13
0
 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")
Example #14
0
 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())
Example #16
0
 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())
Example #18
0
 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())
Example #19
0
    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")
Example #21
0
    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')