<s> from __future__ import print_function <EOL> """<STR_LIT>""" <EOL> __author__ = '<STR_LIT>' <EOL> from six import iteritems <EOL> import time <EOL> from datetime import datetime , timedelta , tzinfo <EOL> import re <EOL> """<STR_LIT>""" <EOL> _dtExpr = re . compile ( <EOL> r'<STR_LIT>' <EOL> r'<STR_LIT>' <EOL> r'<STR_LIT>' <EOL> r'<STR_LIT>' <EOL> r'<STR_LIT>' <EOL> r'<STR_LIT>' <EOL> r'<STR_LIT>' <EOL> r'<STR_LIT>' <EOL> r'<STR_LIT>' <EOL> r'<STR_LIT>' r'<STR_LIT>' r'<STR_LIT>' ) <EOL> """<STR_LIT>""" <EOL> _dtExprKeyDefValMap = { '<STR_LIT>' : None , '<STR_LIT>' : <NUM_LIT:1> , '<STR_LIT>' : <NUM_LIT:1> , <EOL> '<STR_LIT>' : <NUM_LIT:0> , '<STR_LIT>' : <NUM_LIT:0> , '<STR_LIT>' : <NUM_LIT:0> , <EOL> '<STR_LIT>' : <NUM_LIT:0> } <EOL> class TZInfo ( tzinfo ) : <EOL> """<STR_LIT>""" <EOL> timedelta0 = timedelta ( hours = <NUM_LIT:0> ) <EOL> timedelta1 = timedelta ( hours = <NUM_LIT:1> ) <EOL> def __init__ ( self , tzname = '<STR_LIT>' , utcOffset = None , dst = None ) : <EOL> self . _tzname = tzname <EOL> if not utcOffset : <EOL> utcOffset = self . timedelta0 <EOL> self . _utcOffset = utcOffset <EOL> if not dst : <EOL> dst = None <EOL> self . _dst = dst <EOL> def utcoffset ( self , dt ) : <EOL> return self . _utcOffset + self . dst ( dt ) <EOL> def tzname ( self , dt ) : <EOL> return self . _tzname <EOL> def dst ( self , dt ) : <EOL> ret = self . timedelta0 <EOL> if self . _dst : <EOL> if self . _dst [ <NUM_LIT:0> ] <= dt . replace ( tzinfo = None ) < self . _dst [ <NUM_LIT:1> ] : <EOL> ret = self . timedelta1 <EOL> return ret <EOL> class TZManager : <EOL> """<STR_LIT>""" <EOL> _tzInfos = { } <EOL> @ staticmethod <EOL> def GetTZInfo ( tzname = '<STR_LIT>' , utcOffset = None , dst = None ) : <EOL> """<STR_LIT>""" <EOL> key = ( tzname , utcOffset , dst ) <EOL> tzInfo = TZManager . _tzInfos . get ( key ) <EOL> if not tzInfo : <EOL> tzInfo = TZInfo ( tzname , utcOffset , dst ) <EOL> TZManager . _tzInfos [ key ] = tzInfo <EOL> return tzInfo <EOL> def ParseISO8601 ( datetimeStr ) : <EOL> """<STR_LIT>""" <EOL> datetimeVal = None <EOL> match = _dtExpr . match ( datetimeStr ) <EOL> if match : <EOL> try : <EOL> dt = { } <EOL> for key , defaultVal in iteritems ( _dtExprKeyDefValMap ) : <EOL> val = match . group ( key ) <EOL> if val : <EOL> if key == '<STR_LIT>' : <EOL> val = val [ : <NUM_LIT:6> ] + '<STR_LIT:0>' * ( <NUM_LIT:6> - len ( val ) ) <EOL> dt [ key ] = int ( val ) <EOL> elif defaultVal : <EOL> dt [ key ] = defaultVal <EOL> delta = None <EOL> if dt . get ( '<STR_LIT>' , <NUM_LIT:0> ) == <NUM_LIT> : <EOL> if dt . get ( '<STR_LIT>' , <NUM_LIT:0> ) == <NUM_LIT:0> and dt . get ( '<STR_LIT>' , <NUM_LIT:0> ) == <NUM_LIT:0> and dt . get ( '<STR_LIT>' , <NUM_LIT:0> ) == <NUM_LIT:0> : <EOL> dt [ '<STR_LIT>' ] = <NUM_LIT> <EOL> delta = timedelta ( hours = <NUM_LIT:1> ) <EOL> else : <EOL> return None <EOL> tzInfo = None <EOL> val = match . group ( '<STR_LIT>' ) <EOL> if val : <EOL> tzInfo = TZManager . GetTZInfo ( ) <EOL> else : <EOL> val = match . group ( '<STR_LIT>' ) <EOL> if val : <EOL> tzhr = int ( val ) <EOL> utcsign = val [ <NUM_LIT:0> ] <EOL> tzmin = <NUM_LIT:0> <EOL> val = match . group ( '<STR_LIT>' ) <EOL> if val : <EOL> tzmin = tzhr >= <NUM_LIT:0> and int ( val ) or - int ( val ) <EOL> tzname = '<STR_LIT>' <EOL> if tzhr != <NUM_LIT:0> or tzmin != <NUM_LIT:0> : <EOL> tzname += '<STR_LIT>' % ( utcsign , abs ( tzhr ) , abs ( tzmin ) ) <EOL> tzInfo = TZManager . GetTZInfo ( tzname = tzname , <EOL> utcOffset = timedelta ( hours = tzhr , <EOL> minutes = tzmin ) ) <EOL> if tzInfo : <EOL> dt [ '<STR_LIT>' ] = tzInfo <EOL> datetimeVal = datetime ( ** dt ) <EOL> if delta : <EOL> datetimeVal += delta <EOL> except Exception as e : <EOL> pass <EOL> return datetimeVal <EOL> def ISO8601Format ( dt ) : <EOL> """<STR_LIT>""" <EOL> isoStr = dt . strftime ( '<STR_LIT>' ) <EOL> if dt . microsecond : <EOL> isoStr += ( '<STR_LIT>' % dt . microsecond ) . rstrip ( '<STR_LIT:0>' ) <EOL> if dt . tzinfo : <EOL> tz = dt . strftime ( '<STR_LIT>' ) <EOL> else : <EOL> if time . daylight and time . localtime ( ) . tm_isdst : <EOL> utcOffset_minutes = - time . altzone / <NUM_LIT> <EOL> else : <EOL> utcOffset_minutes = - time . timezone / <NUM_LIT> <EOL> tz = "<STR_LIT>" % ( utcOffset_minutes / <NUM_LIT> , ( abs ( utcOffset_minutes ) % <NUM_LIT> ) ) <EOL> if tz == '<STR_LIT>' : <EOL> return isoStr + '<STR_LIT>' <EOL> elif tz : <EOL> return isoStr + tz [ : <NUM_LIT:3> ] + '<STR_LIT::>' + tz [ <NUM_LIT:3> : ] <EOL> else : <EOL> return isoStr + '<STR_LIT>' <EOL> if __name__ == '<STR_LIT:__main__>' : <EOL> for testStr in [ <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> ] : <EOL> dt = ParseISO8601 ( testStr ) <EOL> if dt == None : <EOL> print ( '<STR_LIT>' . format ( testStr ) ) <EOL> assert ( False ) <EOL> isoformat = ISO8601Format ( dt ) <EOL> dt1 = ParseISO8601 ( isoformat ) <EOL> if dt . tzinfo is None : <EOL> dt = dt . replace ( tzinfo = dt1 . tzinfo ) <EOL> if dt1 != dt : <EOL> print ( '<STR_LIT>' . format ( testStr ) ) <EOL> assert ( False ) <EOL> dt2 = ParseISO8601 ( dt . isoformat ( ) ) <EOL> if dt2 == None : <EOL> print ( '<STR_LIT>' . format ( testStr ) ) <EOL> assert ( False ) <EOL> print ( testStr , '<STR_LIT>' , dt , isoformat ) <EOL> for testStr in [ <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> ] : <EOL> dt = ParseISO8601 ( testStr ) <EOL> if dt != None : <EOL> print ( '<STR_LIT>' . format ( testStr ) ) <EOL> assert ( False ) <EOL> for testStr in [ <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> ] : <EOL> dt = ParseISO8601 ( testStr ) <EOL> if dt != None : <EOL> print ( '<STR_LIT>' . format ( testStr ) ) <EOL> assert ( False ) </s>
