从:"1小时前",到:时间差 + 精度

5 投票
2 回答
3213 浏览
提问于 2025-04-16 10:51

有没有什么函数可以把人类说的时间转换回标准的时间格式呢?

比如,给定这些字符串:

  • '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))

撰写回答