Python의 사용자 비활성화 인 시간 형식?
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 %}
하고 필터를 사용중인 템플릿 에 추가 하세요 .
그런 다음 템플릿에서 datetime 변수가있는 경우를 my_date
사용하여 현재로부터의 거리를 인쇄 할 수 있습니다 . {{ my_date|naturaltime }}
이는 다음과 같이 논의 4 minutes ago
됩니다.
세트의 naturaltime
및 기타 필터에 대한 문서입니다 django.contrib.humanize
.
미래 날짜를 처리하는 추가 요구 사항과 동일한 것을 찾고 있었는데, 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'
화살표 패키지로 도 할 수 있습니다.
에서 GitHub의 페이지 :
>>> import arrow >>> utc = arrow.utcnow() >>> utc = utc.replace(hours=-1) >>> local.humanize() 'an hour ago'
Jed Smith가 연결 한 대답은 훌륭하고 1 년 정도 사용했지만 몇 가지 방법으로 개선 할 수 있다고 생각합니다.
- 코드 전체에 뿌려진 3600, 86400 수신 같은 "마법의"상수를 대신 이전 단위의 관점에서 각 시간 단위를 정의 할 수 있습니다.
- 많이 사용할 예정은 너무 열심히 다음 유닛으로 가고 싶지 않습니다. 예 : 7 일과 13 일 모두 "1 주"로 표시됩니다. 대신 "7 일"또는 "13 일"을보고 싶습니다.
내가 생각하는 것은 다음과 가변적이다.
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
평균값으로 설정 합니다. 응용 프로그램이 주어지면 괜찮을 것입니다. (그리고 마지막 세 개의 상수가 연간 일수 인 365.242로 곱해 짐을 한눈에 알 수 있습니다.)
내 기능의 한 가지 단점은 "## 단위"패턴 이외의 작업을 수행하지 않습니다. "어제", "지금 바로"등이 바로 나와 있습니다. 그런 다음 원래 때문에 기능은 멋진 용어를 요구하지 갑자기 간결함과 숫자 상수의 가독성 내을 선호합니다. :)
전에 패키지는이를 제공합니다. 전화 human
A의 차이 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
패키지는 :
>>> 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와 함께 datetime 객체 사용 :
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
이것은 @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)
아래 링크에서 다운로드하여 수 있습니다. 당신에게 더 도움이 될 것입니다. 2 년부터 2 년까지 사용자는이 메시지를 제공하고 있습니다.
잘 테스트되었습니다.
https://github.com/nareshchaudhary37/timestamp_content
가상 환경에 설치하는 다음과 변화합니다.
git clone https://github.com/nareshchaudhary37/timestamp_content
cd timestamp-content
python setup.py
다음 날짜는 순진 및 자동 인식 시간을 모두 전달하는 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"
참고 URL : https://stackoverflow.com/questions/1551382/user-friendly-time-format-in-python
'ProgramingTip' 카테고리의 다른 글
편리한 정수 비교 기능 (0) | 2020.11.29 |
---|---|
sqlite3 (~> 1.3.6)을 활성화 할 수 없음, 이미 활성화 된 sqlite3-1.4.0 (0) | 2020.11.29 |
mysql에 금액 저장 (0) | 2020.11.29 |
CSS : 이미지 링크, 마우스 오버시 변경 (0) | 2020.11.29 |
명령 줄을 대용량 SQL 파일을 MySql로 가져 오기 (0) | 2020.11.29 |