37

Pythonで日付の付いたアイテムの自然な時間を表示する方法が欲しいのですが。Twitterが「少し前」、「数分前」、「2時間前」、「3日前」などのメッセージを表示するのと同じです。

Django 1.0には、django.contribに「humanize」メソッドがあります。私はDjangoフレームワークを使用していません。使用したとしても、使用したいものよりも制限があります。

私(そして将来の検索者の世代)に、すでに有効な解決策があるかどうかを知らせてください。これは十分に一般的なタスクなので、何かがあるに違いないと思います。

4

6 に答える 6

38

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)
于 2011-03-02T06:09:12.097 に答える
18

現時点では役に立たないかもしれませんが、将来の検索者にとってはそうなるかもしれません: あらゆる種類のロケールを扱う 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'

これは、タイム デルタ フォーマットに関するバベルのドキュメントから直接取得したものです。これにより、少なくとも途中であなたを得ることができます。「数分前」などのレベルまで曖昧にすることはありませんが、「n 分」などは正しく複数形にします。

価値のあることとして、babel モジュールには、ロケールに従って日付と時刻をフォーマットするための関数も含まれています。これは、時間差が大きい場合に役立つ場合があります。

于 2009-01-04T04:52:36.340 に答える
8

または、他に2つの依存関係しかないDjangoのtimesince.pyを簡単に適応させることができます。1つは翻訳用(不要な場合があります)、もう1つはタイムゾーン用(簡単に適応できます)です。

ちなみに、Djangoにはかなり柔軟なBSDライセンスがあり、現在使用しているどのプロジェクトでも使用できます。

于 2009-01-04T03:02:03.693 に答える
5

このようなもの(Pythonでの相対的な日付の印刷)をお探しですか?

于 2009-01-04T02:52:41.513 に答える