سؤال

أرغب في طريقة لإظهار الأوقات الطبيعية للعناصر القديمة في بايثون.على غرار الطريقة التي سيعرض بها تويتر رسالة من "قبل لحظة"، "قبل بضع دقائق"، "قبل ساعتين"، "قبل ثلاثة أيام"، وما إلى ذلك.

يحتوي Django 1.0 على طريقة "إضفاء طابع إنساني" في django.contrib.أنا لا أستخدم إطار عمل Django، وحتى لو كنت أستخدمه، فهو محدود أكثر مما أريد.

من فضلك دعني (وأجيال الباحثين المستقبليين) أعرف ما إذا كان هناك حل عملي جيد بالفعل.وبما أن هذه مهمة شائعة بما فيه الكفاية، أتصور أنه لا بد من وجود شيء ما.

هل كانت مفيدة؟

المحلول

وحين لا فائدة لك في هذه اللحظة بالذات، قد يكون ذلك بالنسبة للباحثين في المستقبل: وحدة بابل، الذي يتعامل مع جميع أنواع الأشياء لغة، لديه وظيفة للقيام أكثر أو أقل ما تريد. حاليا انها فقط في جذع على الرغم من ذلك، لا في الإصدار الأخير العامة (الإصدار 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'

ويؤخذ هذا مباشرة من الوثائق بابل في الوقت المحدد التنسيق دلتا . وهذا على الأقل تحصل على أجزاء من الطريق. انها لن تفعل غموض وصولا الى مستوى "منذ لحظات" وعلى هذا الأساس، لكنها لن تفعل "ن دقيقة"، وغيرها بصيغة الجمع بشكل صحيح.

لما يستحق، ويحتوي على وحدة بابل أيضا وظائف لتنسيق التواريخ والأوقات وفقا للغة، والتي قد تكون مفيدة عند دلتا وقت كبير.

نصائح أخرى

ومواعيد تويتر على وجه الخصوص مثيرة للاهتمام لأنها النسبي فقط في اليوم الأول. بعد 24 ساعة من أنها تظهر فقط في الشهر واليوم. بعد عام يبدأون تظهر آخر رقمين من السنة. وهنا وظيفة العينة أن يفعل شيئا أقرب إلى مواعيد النسبية تويتر، على الرغم من أنه يظهر دائما في العام أيضا بعد 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 من جانغو التي ليس لديها سوى 2 تبعيات أخرى لنفسه: واحد للترجمة (والتي قد لا تحتاج) واحد للالزمنية (والتي يمكن أن تتكيف بسهولة)

وبالمناسبة، جانغو لديه ترخيص BSD التي تتسم بالمرونة إلى حد ما، عليك أن تكون قادرا على استخدامها في أي مشروع الذي تستخدمه حاليا.

هل تبحث عن شيئا من هذا القبيل (وطباعة تواريخ النسبية في بايثون)؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top