class Time(Element): """ Time element. """ tagName = u"Time" Name = attributeproxy(u"Name") Type = attributeproxy(u"Type", default = u"ISO-8601") def __init__(self, *args): super(Time, self).__init__(*args) if self.Type not in ligolwtypes.TimeTypes: raise ElementError("invalid Type for Time: '%s'" % self.Type) def endElement(self): if self.Type == u"ISO-8601": import dateutil.parser self.pcdata = dateutil.parser.parse(self.pcdata) elif self.Type == u"GPS": from lal import LIGOTimeGPS # FIXME: remove cast to string when lal swig # can cast from unicode self.pcdata = LIGOTimeGPS(str(self.pcdata)) elif self.Type == u"Unix": self.pcdata = float(self.pcdata) else: # unsupported time type. not impossible that # calling code has overridden TimeTypes set in # glue.ligolw.types; just accept it as a string pass def write(self, fileobj = sys.stdout, indent = u""): fileobj.write(self.start_tag(indent)) if self.pcdata is not None: if self.Type == u"ISO-8601": fileobj.write(xmlescape(unicode(self.pcdata.isoformat()))) elif self.Type == u"GPS": fileobj.write(xmlescape(unicode(self.pcdata))) elif self.Type == u"Unix": fileobj.write(xmlescape(u"%.16g" % self.pcdata)) else: # unsupported time type. not impossible. # assume correct thing to do is cast to # unicode and let calling code figure out # how to ensure that does the correct # thing. fileobj.write(xmlescape(unicode(self.pcdata))) fileobj.write(self.end_tag(u"")) fileobj.write(u"\n") @classmethod def now(cls, Name = None): """ Instantiate a Time element initialized to the current UTC time in the default format (ISO-8601). The Name attribute will be set to the value of the Name parameter if given. """ import datetime self = cls() if Name is not None: self.Name = Name self.pcdata = datetime.datetime.utcnow() return self @classmethod def from_gps(cls, gps, Name = None): """ Instantiate a Time element initialized to the value of the given GPS time. The Name attribute will be set to the value of the Name parameter if given. Note: the new Time element holds a reference to the GPS time, not a copy of it. Subsequent modification of the GPS time object will be reflected in what gets written to disk. """ self = cls(AttributesImpl({u"Type": u"GPS"})) if Name is not None: self.Name = Name self.pcdata = gps return self