|
|
|
@ -29,10 +29,9 @@ class DataMapper:
|
|
|
|
|
|
|
|
|
|
def _handle_datetime(self, value):
|
|
|
|
|
dt = self._parse_datetime(value)
|
|
|
|
|
return dt.strftime('%Y-%m-%d %H:%M:%S') if dt else '1970-01-01 00:00:00'
|
|
|
|
|
return dt if dt else self.min_date
|
|
|
|
|
|
|
|
|
|
def _parse_datetime(self, value):
|
|
|
|
|
# 完整日期解析逻辑
|
|
|
|
|
if value in (None, 0, '0', '0.0', '0.00', '', 'null', 'NULL'):
|
|
|
|
|
return self.min_date
|
|
|
|
|
|
|
|
|
@ -40,17 +39,26 @@ class DataMapper:
|
|
|
|
|
str_value = str(value).strip()
|
|
|
|
|
for fmt in ('%Y-%m-%d %H:%M:%S', '%Y-%m-%d', '%Y%m%d%H%M%S', '%Y/%m/%d %H:%M:%S'):
|
|
|
|
|
try:
|
|
|
|
|
return datetime.strptime(str_value, fmt)
|
|
|
|
|
parsed = datetime.strptime(str_value, fmt)
|
|
|
|
|
return self._clamp_datetime(parsed)
|
|
|
|
|
except ValueError:
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
if str_value.isdigit():
|
|
|
|
|
ts = int(str_value)
|
|
|
|
|
if 1e12 < ts < 1e13: # 毫秒级时间戳
|
|
|
|
|
return datetime.fromtimestamp(ts / 1000)
|
|
|
|
|
parsed = datetime.fromtimestamp(ts / 1000)
|
|
|
|
|
elif 1e9 < ts < 1e10: # 秒级时间戳
|
|
|
|
|
return datetime.fromtimestamp(ts)
|
|
|
|
|
parsed = datetime.fromtimestamp(ts)
|
|
|
|
|
return self._clamp_datetime(parsed)
|
|
|
|
|
|
|
|
|
|
return self.min_date
|
|
|
|
|
except:
|
|
|
|
|
return self.min_date
|
|
|
|
|
return self.min_date
|
|
|
|
|
|
|
|
|
|
def _clamp_datetime(self, dt):
|
|
|
|
|
if dt < self.min_date:
|
|
|
|
|
return self.min_date
|
|
|
|
|
elif dt > self.max_date:
|
|
|
|
|
return self.max_date
|
|
|
|
|
return dt
|