Python:「1日前」、「2時間前」の形式でファイル変更時刻を表示する必要があります。
それを行う準備ができていますか?英語でなければなりません。
コードはもともとブログ記事「Python Pretty Date function」で公開されました( http://evaisse.com/post/93417709/python-pretty-date-function )
ブログアカウントが一時停止され、ページが利用できなくなったため、ここで再現されています。
def pretty_date(time=False):
"""
Get a datetime object or a int() Epoch timestamp and return a
pretty string like 'an hour ago', 'Yesterday', '3 months ago',
'just now', etc
"""
from datetime import datetime
now = datetime.now()
if type(time) is int:
diff = now - datetime.fromtimestamp(time)
Elif isinstance(time,datetime):
diff = now - time
Elif not time:
diff = now - now
second_diff = diff.seconds
day_diff = diff.days
if day_diff < 0:
return ''
if day_diff == 0:
if second_diff < 10:
return "just now"
if second_diff < 60:
return str(second_diff) + " seconds ago"
if second_diff < 120:
return "a minute ago"
if second_diff < 3600:
return str(second_diff / 60) + " minutes ago"
if second_diff < 7200:
return "an hour ago"
if second_diff < 86400:
return str(second_diff / 3600) + " hours ago"
if day_diff == 1:
return "Yesterday"
if day_diff < 7:
return str(day_diff) + " days ago"
if day_diff < 31:
return str(day_diff / 7) + " weeks ago"
if day_diff < 365:
return str(day_diff / 30) + " months ago"
return str(day_diff / 365) + " years ago"
Django を使用している場合、バージョン1.4の新機能はnaturaltime
テンプレートフィルターです。
使用するには、まずsettings.pyの'Django.contrib.humanize'
設定にINSTALLED_APPS
を追加し、フィルターを使用しているテンプレートに{% load humanize %}
を追加します。
次に、テンプレートに日時変数my_date
がある場合、{{ my_date|naturaltime }}
のようなものとしてレンダリングされる4 minutes ago
を使用して、現在からの距離を印刷できます。
Django 1.4。 の他の新しいもの)==
将来の日付を処理するという追加の要件を持つ同じものを探して、私はこれを見つけました: http://pypi.python.org/pypi/py-pretty/1
サンプルコード(サイトから):
from datetime import datetime, timedelta
now = datetime.now()
hrago = now - timedelta(hours=1)
yesterday = now - timedelta(days=1)
tomorrow = now + timedelta(days=1)
dayafter = now + timedelta(days=2)
import pretty
print pretty.date(now) # 'now'
print pretty.date(hrago) # 'an hour ago'
print pretty.date(hrago, short=True) # '1h ago'
print pretty.date(hrago, asdays=True) # 'today'
print pretty.date(yesterday, short=True) # 'yest'
print pretty.date(tomorrow) # 'tomorrow'
Jed Smithがリンクした回答は良いもので、1年ほど使用しましたが、いくつかの方法で改善できると思います。
ここに私が思いついたものがあります:
_def PrettyRelativeTime(time_diff_secs):
# Each Tuple in the sequence gives the name of a unit, and the number of
# previous units which go into it.
weeks_per_month = 365.242 / 12 / 7
intervals = [('minute', 60), ('hour', 60), ('day', 24), ('week', 7),
('month', weeks_per_month), ('year', 12)]
unit, number = 'second', abs(time_diff_secs)
for new_unit, ratio in intervals:
new_number = float(number) / ratio
# If the new number is too small, don't go to the next unit.
if new_number < 2:
break
unit, number = new_unit, new_number
shown_num = int(number)
return '{} {}'.format(shown_num, unit + ('' if shown_num == 1 else 's'))
_
intervals
のすべてのタプルがどのように簡単に解釈およびチェックできるかに注意してください。a_'minute'
_は_60
_秒です。 _'hour'
_は_60
_分です。など。唯一のファッジは、_weeks_per_month
_をその平均値に設定することです。アプリケーションを考えると、それは問題ないはずです。 (また、最後の3つの定数が365.242(1年あたりの日数)に乗算されることが一目でわかることに注意してください。)
私の機能の欠点の1つは、「## units」パターン以外には何もしないということです。「昨日」、「今」などはすぐに実行されます。繰り返しになりますが、元のポスターはこれらの派手な用語を要求していませんでしたので、簡潔さと数値定数の可読性のために私の機能を好みます。 :)
ago パッケージがこれを提供します。 human
オブジェクトでdatetime
を呼び出して、人間が読み取れる違いの説明を取得します。
from ago import human
from datetime import datetime
from datetime import timedelta
ts = datetime.now() - timedelta(days=1, hours=5)
print(human(ts))
# 1 day, 5 hours ago
print(human(ts, precision=1))
# 1 day ago
humanize
package があります:
>>> from datetime import datetime, timedelta
>>> import humanize # $ pip install humanize
>>> humanize.naturaltime(datetime.now() - timedelta(days=1))
'a day ago'
>>> humanize.naturaltime(datetime.now() - timedelta(hours=2))
'2 hours ago'
>>> _ = humanize.i18n.activate('ru_RU')
>>> print humanize.naturaltime(datetime.now() - timedelta(days=1))
день назад
>>> print humanize.naturaltime(datetime.now() - timedelta(hours=2))
2 часа назад
Tzinfoで日時オブジェクトを使用する:
def time_elapsed(etime):
# need to add tzinfo to datetime.utcnow
now = datetime.datetime.utcnow().replace(tzinfo=etime.tzinfo)
opened_for = (now - etime).total_seconds()
names = ["seconds","minutes","hours","days","weeks","months"]
modulos = [ 1,60,3600,3600*24,3600*24*7,3660*24*30]
values = []
for m in modulos[::-1]:
values.append(int(opened_for / m))
opened_for -= values[-1]*m
pretty = []
for i,nm in enumerate(names[::-1]):
if values[i]!=0:
pretty.append("%i %s" % (values[i],nm))
return " ".join(pretty)
http://sunilarora.org/17329071 にソリューションの詳細なブログ記事を書きました。ここにも簡単なスニペットを掲載しています。
from datetime import datetime
from dateutil.relativedelta import relativedelta
def get_fancy_time(d, display_full_version = False):
"""Returns a user friendly date format
d: some datetime instace in the past
display_second_unit: True/False
"""
#some helpers lambda's
plural = lambda x: 's' if x > 1 else ''
singular = lambda x: x[:-1]
#convert pluran (years) --> to singular (year)
display_unit = lambda unit, name: '%s %s%s'%(unit, name, plural(unit)) if unit > 0 else ''
#time units we are interested in descending order of significance
tm_units = ['years', 'months', 'days', 'hours', 'minutes', 'seconds']
rdelta = relativedelta(datetime.utcnow(), d) #capture the date difference
for idx, tm_unit in enumerate(tm_units):
first_unit_val = getattr(rdelta, tm_unit)
if first_unit_val > 0:
primary_unit = display_unit(first_unit_val, singular(tm_unit))
if display_full_version and idx < len(tm_units)-1:
next_unit = tm_units[idx + 1]
second_unit_val = getattr(rdelta, next_unit)
if second_unit_val > 0:
secondary_unit = display_unit(second_unit_val, singular(next_unit))
return primary_unit + ', ' + secondary_unit
return primary_unit
return None
これは、オフセット未処理の日付時刻とオフセット対応の日付時刻の両方を適切に処理するJed Smithの実装に基づく更新された回答です。デフォルトのタイムゾーンを指定することもできます。 Python 3.5+。
import datetime
def pretty_date(time=None, default_timezone=datetime.timezone.utc):
"""
Get a datetime object or a int() Epoch timestamp and return a
pretty string like 'an hour ago', 'Yesterday', '3 months ago',
'just now', etc
"""
# Assumes all timezone naive dates are UTC
if time.tzinfo is None or time.tzinfo.utcoffset(time) is None:
if default_timezone:
time = time.replace(tzinfo=default_timezone)
now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
if type(time) is int:
diff = now - datetime.fromtimestamp(time)
Elif isinstance(time, datetime.datetime):
diff = now - time
Elif not time:
diff = now - now
second_diff = diff.seconds
day_diff = diff.days
if day_diff < 0:
return ''
if day_diff == 0:
if second_diff < 10:
return "just now"
if second_diff < 60:
return str(second_diff) + " seconds ago"
if second_diff < 120:
return "a minute ago"
if second_diff < 3600:
return str(second_diff / 60) + " minutes ago"
if second_diff < 7200:
return "an hour ago"
if second_diff < 86400:
return str(second_diff / 3600) + " hours ago"
if day_diff == 1:
return "Yesterday"
if day_diff < 7:
return str(day_diff) + " days ago"
if day_diff < 31:
return str(day_diff / 7) + " weeks ago"
if day_diff < 365:
return str(day_diff / 30) + " months ago"
return str(day_diff / 365) + " years ago"
以下のリンクからダウンロードしてインストールできます。あなたにとってもっと役立つはずです。 2年目から1年目までユーザーフレンドリーなメッセージを提供しています。
十分にテストされています。
https://github.com/nareshchaudhary37/timestamp_content
仮想環境にインストールする以下の手順。
git clone https://github.com/nareshchaudhary37/timestamp_content
cd timestamp-content
python setup.py
これは@sunilの投稿の要点です
>>> from datetime import datetime
>>> from dateutil.relativedelta import relativedelta
>>> then = datetime(2003, 9, 17, 20, 54, 47, 282310)
>>> relativedelta(then, datetime.now())
relativedelta(years=-11, months=-3, days=-9, hours=-18, minutes=-17, seconds=-8, microseconds=+912664)