5

時間を「人間化」する機能はありますか?

たとえば、与えられた (文字列):

  • '1分前'
  • '7時間前'
  • '5日前'
  • '2ヶ月前'

返される可能性があります (疑似コードで申し訳ありません):

  • datetime.now() - timedelta (1 分)、accuracy (60 秒)
  • datetime.now() - timedelta (7 時間)、accuracy (1 時間)
  • datetime.now() - timedelta (5 日)、accuracy (1 日)
  • datetime.now() - timedelta (2 か月)、accuracy (1 か月)
4

2 に答える 2

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))
于 2011-01-29T21:50:12.370 に答える
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

入力はそれほど変化しいないように見えます。

于 2011-02-16T22:25:08.910 に答える