来自:“1小时前”,To:timedelta +准确度

时间:2011-01-29 21:45:02

标签: python datetime time humanize

是否有“逆转人性化”的功能?

例如,给定(字符串):

  • '1分钟前'
  • '7小时前'
  • '5天前'
  • '2个月前'

可以返回(为伪代码道歉):

  • datetime.now() - timedelta(1分钟),准确度(60秒)
  • datetime.now() - timedelta(7小时),准确度(1小时)
  • datetime.now() - timedelta(5天),准确度(1天)
  • datetime.now() - timedelta(2个月),准确度(1个月)

2 个答案:

答案 0 :(得分:1)

我一直在使用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))

答案 1 :(得分:1)

你能不能自己编写一个简单的实现,例如:

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

输入看起来 变化。