質問

日付付きアイテムの自然な時間をPythonで表示する方法が欲しい。 Twitterが「ちょっと前」、「数分前」、「2時間前」、「3日前」などからのメッセージを表示する方法に似ています

Django 1.0には「ヒューマナイズ」機能があります。 django.contribのメソッド。私は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)

humanizeパッケージがあります:

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

さらに(上記のリンクを参照)、以下の人間化もサポートしています:

  • 整数
  • ファイルサイズ
  • floats(小数へ)

または timesince.py Djangoからは、それ自体に2つの依存関係しかありません。1つは翻訳用(必要ではないかもしれません)、もう1つはタイムゾーン用(簡単に調整可能)です。

ところで、 Djangoには非常に柔軟なBSDライセンスがあります、現在使用しているプロジェクトで使用できます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top