Pythonで日付の付いたアイテムの自然な時間を表示する方法が欲しいのですが。 Twitterが「少し前」、「数分前」、「2時間前」、「3日前」などのメッセージを表示するのと同じです。
Django 1.0には、Django.contribに「humanize」メソッドがあります。私はDjangoフレームワークを使用していません。使用したとしても、それは私が望むものよりも制限されています。
私(そして将来の検索者の世代)に、すでに有効な解決策があるかどうかを知らせてください。これは十分に一般的なタスクなので、何かがあるに違いないと思います。
現時点では役に立ちませんが、将来の検索者にとっては役立つかもしれません。あらゆる種類のロケールを処理するbabelモジュールには、多かれ少なかれ必要なことを実行する機能があります。現在、それは彼らのトランクにのみあり、最新のパブリックリリース(バージョン0.9.4)にはありません。機能がリリースに入ると、次のようなことができます。
from datetime import timedelta
from babel.dates import format_timedelta
delta = timedelta(days=6)
format_timedelta(delta, locale='en_US')
u'1 week'
これは タイムデルタフォーマットに関するbabelドキュメント から直接取得されます。これは少なくともあなたに道の一部を与えるでしょう。 「少し前」などのレベルまではぼやけませんが、「n分」などは正しく複数形になります。
価値があるので、babelモジュールには、ロケールに従って日付と時刻をフォーマットするための関数も含まれています。これは、時間デルタが大きい場合に役立つことがあります。
特にTwitterの日付は、初日のみの相対的なものであるため、興味深いものです。 24時間後、月と日が表示されます。 1年後、彼らはその年の下2桁を表示し始めます。これは、Twitterの相対的な日付に似た何かを行うサンプル関数ですが、24時間後も常に年が表示されます。これは米国ロケールのみですが、必要に応じていつでも変更できます。
# tested in Python 2.7
import datetime
def prettydate(d):
diff = datetime.datetime.utcnow() - d
s = diff.seconds
if diff.days > 7 or diff.days < 0:
return d.strftime('%d %b %y')
Elif diff.days == 1:
return '1 day ago'
Elif diff.days > 1:
return '{} days ago'.format(diff.days)
Elif s <= 1:
return 'just now'
Elif s < 60:
return '{} seconds ago'.format(s)
Elif s < 120:
return '1 minute ago'
Elif s < 3600:
return '{} minutes ago'.format(s/60)
Elif s < 7200:
return '1 hour ago'
else:
return '{} hours ago'.format(s/3600)
ヒューマナイズパッケージ があります:
>>> import humanize
>>> import datetime
>>> humanize.naturalday(datetime.datetime.now())
'today'
>>> humanize.naturalday(datetime.datetime.now() - datetime.timedelta(days=1))
'yesterday'
>>> humanize.naturalday(datetime.date(2007, 6, 5))
'Jun 05'
>>> humanize.naturaldate(datetime.date(2007, 6, 5))
'Jun 05 2007'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=1))
'a second ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600))
'an hour ago'
ユースケースの例:
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=36000))
'10 hours ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=360000))
'4 days ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600000))
'a month ago'
さらに(上記のリンクを参照)、次の人間化もサポートします。
または、簡単に適応させることもできます timesince.py from Djangoこれには、他に2つの依存関係しかありません。1つは翻訳用(不要な場合があります)、もう1つはタイムゾーン用(簡単に適応できます)。
ちなみに、 DjangoにはBSDライセンスがあります これはかなり柔軟性があり、現在使用しているどのプロジェクトでも使用できます。
あなたは このようなもの (Pythonで相対日付を印刷する)を探していますか?