从:"1小时前",到:时间差 + 精度
有没有什么函数可以把人类说的时间转换回标准的时间格式呢?
比如,给定这些字符串:
- '1分钟前'
- '7小时前'
- '5天前'
- '2个月前'
可以返回(抱歉这是伪代码):
- 当前时间 - 1分钟,精确到60秒
- 当前时间 - 7小时,精确到1小时
- 当前时间 - 5天,精确到1天
- 当前时间 - 2个月,精确到1个月
2 个回答
2
你可以自己写一个简单的实现,比如:
import datetime
def parsedatetime(str_val):
parts = str_val.split(' ')
if len(parts) != 3 and parts[2] != 'ago':
raise Exception("can't parse %s" % str_val)
try:
interval = int(parts[0])
except ValueError,e :
raise Exception("can't parse %s" % str_val)
desc = parts[1]
if 'second' in desc:
td = datetime.timedelta(seconds=interval)
elif 'minute' in desc:
td = datetime.timedelta(minutes=interval)
elif 'hour' in desc:
td = datetime.timedelta(minutes=interval*60)
elif 'day' in desc:
td = datetime.timedelta(days=interval)
else:
raise Exception("cant parse %s" % str_val)
answer = datetime.datetime.now - td
return answer
输入的数据看起来并没有那么复杂。
2
我一直在使用 parsedatetime,效果还不错。它的主页上列出了一些它能处理的时间格式,比如:
- 5分钟后
- 从现在起5分钟
- 中午前2小时
- 从明天起2天
我发现的一个主要缺点是,它对时区没有概念。
如果这对你有帮助的话,这里有一个我使用的包装函数,它总是返回一个 datetime
对象,无论输入的字符串是相对时间(像上面的例子)还是固定时间:
def parse_datetime(datetime_string):
datetime_parser = parsedatetime.Calendar(parsedatetime_consts.Constants())
timestamp = datetime_parser.parse(datetime_string)
if len(timestamp) == 2:
if timestamp[1] == 0:
raise ValueError(u'Failed to parse datetime: %s' % datetime_string)
timestamp = timestamp[0]
return datetime.fromtimestamp(time.mktime(timestamp))