日期时间年份超出范围
datetime year out of range
我将 abcef-1591282803
等文件名传递给此函数,该函数运行良好:
def parse_unixtimestamp(filename):
ts = re.findall(r'\d{10}', filename)[0]
return ts
但是,然后我将函数修改为此,因此当时间戳为 13 位而不是 10 位时它也可以工作。file20-name-1591282803734
def parse_unixtimestamp(filename):
ts = re.findall(r'\d{13}|\d{10}', filename)[0]
return ts
到这里才报错。但是如果是 13 位数字,我会得到这样的 ts 值 1591282803734
。现在,当我将此值传递给 year
的此函数时:
def get_dateparts(in_unixtimestamp):
dt_object = datetime.fromtimestamp(int(in_unixtimestamp))
date_string = dt_object.strftime("%Y-%m-%d")
year_string = dt_object.strftime("%Y")
month_string = dt_object.strftime("%m")
day_string = dt_object.strftime("%d")
logger.info(f'year_string: {year_string}')
result = {"date_string": date_string, "year_string": year_string, "month_string": month_string,
"day_string": day_string}
return result
我得到一个错误:
year 52395 is out of range
当传入 parse_unixtimestamp
的 unixtimestamp 只有 10 位时,我不会得到这个错误。我怎样才能修改这个函数,使其在两种情况下都能正常工作?
datetime.fromtimestamp
要求您提供以秒为单位的时间。如果您的字符串有 13 位而不是 9 位(即毫秒),您应该使用:
>>> datetime.fromtimestamp(1591282803734/1000)
datetime.datetime(2020, 6, 4, 11, 0, 3, 734000)
要在您的函数中执行此操作,您可以在调用 datetime.fromtimestamp
之前检查时间戳的长度。
按如下方式更改您的函数:
def get_dateparts(in_unixtimestamp):
if len(in_unixtimestamp) == 13:
dt_object = datetime.fromtimestamp(int(in_unixtimestamp)/1000)
else:
dt_object = datetime.fromtimestamp(int(in_unixtimestamp))
date_string = dt_object.strftime("%Y-%m-%d")
year_string = dt_object.strftime("%Y")
month_string = dt_object.strftime("%m")
day_string = dt_object.strftime("%d")
logger.info(f'year_string: {year_string}')
result = {"date_string": date_string,
"year_string": year_string,
"month_string": month_string,
"day_string": day_string}
return result
>>> get_dateparts(parse_unixtimestamp("abcef-1591282803"))
{'date_string': '2020-06-04',
'year_string': '2020',
'month_string': '06',
'day_string': '04'}
>>> get_dateparts(parse_unixtimestamp("file20-name-1591282803734"))
{'date_string': '2020-06-04',
'year_string': '2020',
'month_string': '06',
'day_string': '04'}
我将 abcef-1591282803
等文件名传递给此函数,该函数运行良好:
def parse_unixtimestamp(filename):
ts = re.findall(r'\d{10}', filename)[0]
return ts
但是,然后我将函数修改为此,因此当时间戳为 13 位而不是 10 位时它也可以工作。file20-name-1591282803734
def parse_unixtimestamp(filename):
ts = re.findall(r'\d{13}|\d{10}', filename)[0]
return ts
到这里才报错。但是如果是 13 位数字,我会得到这样的 ts 值 1591282803734
。现在,当我将此值传递给 year
的此函数时:
def get_dateparts(in_unixtimestamp):
dt_object = datetime.fromtimestamp(int(in_unixtimestamp))
date_string = dt_object.strftime("%Y-%m-%d")
year_string = dt_object.strftime("%Y")
month_string = dt_object.strftime("%m")
day_string = dt_object.strftime("%d")
logger.info(f'year_string: {year_string}')
result = {"date_string": date_string, "year_string": year_string, "month_string": month_string,
"day_string": day_string}
return result
我得到一个错误:
year 52395 is out of range
当传入 parse_unixtimestamp
的 unixtimestamp 只有 10 位时,我不会得到这个错误。我怎样才能修改这个函数,使其在两种情况下都能正常工作?
datetime.fromtimestamp
要求您提供以秒为单位的时间。如果您的字符串有 13 位而不是 9 位(即毫秒),您应该使用:
>>> datetime.fromtimestamp(1591282803734/1000)
datetime.datetime(2020, 6, 4, 11, 0, 3, 734000)
要在您的函数中执行此操作,您可以在调用 datetime.fromtimestamp
之前检查时间戳的长度。
按如下方式更改您的函数:
def get_dateparts(in_unixtimestamp):
if len(in_unixtimestamp) == 13:
dt_object = datetime.fromtimestamp(int(in_unixtimestamp)/1000)
else:
dt_object = datetime.fromtimestamp(int(in_unixtimestamp))
date_string = dt_object.strftime("%Y-%m-%d")
year_string = dt_object.strftime("%Y")
month_string = dt_object.strftime("%m")
day_string = dt_object.strftime("%d")
logger.info(f'year_string: {year_string}')
result = {"date_string": date_string,
"year_string": year_string,
"month_string": month_string,
"day_string": day_string}
return result
>>> get_dateparts(parse_unixtimestamp("abcef-1591282803"))
{'date_string': '2020-06-04',
'year_string': '2020',
'month_string': '06',
'day_string': '04'}
>>> get_dateparts(parse_unixtimestamp("file20-name-1591282803734"))
{'date_string': '2020-06-04',
'year_string': '2020',
'month_string': '06',
'day_string': '04'}