def parse_time_expression(value): def simple_date(sign, dig, type, floor): if dig or sign: from pyLibrary.debugs.logs import Log Log.error("can not accept a multiplier on a datetime") if floor: return Date(type).floor(Duration(floor)) else: return Date(type) terms = re.match(r'(\d*[|\w]+)\s*([+-]\s*\d*[|\w]+)*', value).groups() sign, dig, type = re.match(r'([+-]?)\s*(\d*)([|\w]+)', terms[0]).groups() if "|" in type: type, floor = type.split("|") else: floor = None if type in MILLI_VALUES.keys(): value = Duration(dig+type) else: value = simple_date(sign, dig, type, floor) for term in terms[1:]: if not term: continue sign, dig, type = re.match(r'([+-])\s*(\d*)([|\w]+)', term).groups() if "|" in type: type, floor = type.split("|") else: floor = None op = {"+": "__add__", "-": "__sub__"}[sign] if type in MILLI_VALUES.keys(): if floor: from pyLibrary.debugs.logs import Log Log.error("floor (|) of duration not accepted") value = value.__getattribute__(op)(Duration(dig+type)) else: value = value.__getattribute__(op)(simple_date(sign, dig, type, floor)) return value
def unicode2datetime(value, format=None): """ CONVERT UNICODE STRING TO datetime VALUE """ ## http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior if value == None: return None value = value.strip() if value.lower() == "now": return Date.now().value elif value.lower() == "today": return Date.today().value elif value.lower() in ["eod", "tomorrow"]: return Date.eod().value if any(value.lower().find(n) >= 0 for n in ["now", "today", "eod", "tomorrow"] + list(MILLI_VALUES.keys())): return parse(value).value if format != None: try: return datetime.strptime(value, format) except Exception, e: from pyLibrary.debugs.logs import Log Log.error("Can not format {{value}} with {{format}}", value=value, format=format, cause=e)
value += ".000" return unix2Date(datetime2unix(datetime.strptime(value, format))) except Exception, e: from pyLibrary.debugs.logs import Log Log.error("Can not format {{value}} with {{format}}", value=value, format=format, cause=e) value = value.strip() if value.lower() == "now": return unix2Date(datetime2unix(datetime.utcnow())) elif value.lower() == "today": return unix2Date(math.floor(datetime2unix(datetime.utcnow()) / 86400) * 86400) elif value.lower() in ["eod", "tomorrow"]: return unix2Date(math.floor(datetime2unix(datetime.utcnow()) / 86400) * 86400 + 86400) if any(value.lower().find(n) >= 0 for n in ["now", "today", "eod", "tomorrow"] + list(MILLI_VALUES.keys())): return parse_time_expression(value) try: # 2.7 DOES NOT SUPPORT %z local_value = parse_date(value) #eg 2014-07-16 10:57 +0200 return unix2Date(datetime2unix((local_value - local_value.utcoffset()).replace(tzinfo=None))) except Exception: pass formats = [ "%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%S.%f" ] for f in formats: try: return unix2Date(datetime2unix(datetime.strptime(value, f)))