2009-01-04 11 views
35

मुझे पायथन में दिनांकित वस्तुओं के लिए प्राकृतिक समय दिखाने का एक तरीका चाहिए। इसी तरह ट्विटर "एक पल पहले", "कुछ मिनट पहले", "दो घंटे पहले", "तीन दिन पहले", "0 दिन पहले", आदिपायथन में प्राकृतिक/सापेक्ष दिन

Django 1.0 में django में "मानविकी" विधि है .contrib। मैं Django ढांचे का उपयोग नहीं कर रहा हूं, और यहां तक ​​कि अगर मैं भी था, तो यह मेरी अपेक्षा से अधिक सीमित है।

कृपया मुझे (और भावी खोजकर्ताओं की पीढ़ियों) को पता है कि पहले से ही एक अच्छा कामकाजी समाधान है या नहीं। चूंकि यह एक आम काम है, मुझे लगता है कि कुछ होना चाहिए।

+0

मैं इस पाया: http://code.google.com/p/parsedatetime/ लेकिन इस तारीखों के कई अलग अलग रूपों पार्स करने के लिए हो रहा है , जबकि मैं बस डेटाटाइम ऑब्जेक्ट को स्वरूपित करने में रूचि रखता हूं। – jamtoday

उत्तर

16

हालांकि इस समय आपके लिए उपयोगी नहीं है, यह भविष्य के खोजकर्ताओं के लिए ऐसा हो सकता है: बेबेल मॉड्यूल, जो सभी प्रकार के लोकेल सामानों से संबंधित है, में आपके इच्छित चीजों को कम या कम करने के लिए एक कार्य है। वर्तमान में यह केवल उनके ट्रंक में है, नवीनतम सार्वजनिक रिलीज (संस्करण 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' 

यह the babel documentation on time delta formatting से सीधे लिया जाता है: एक बार एक विज्ञप्ति में कार्यक्षमता की भूमि है, आप कुछ की तरह कर सकता है। यह कम से कम आपको रास्ते के कुछ हिस्सों को प्राप्त करेगा। यह "क्षण पहले" के स्तर तक अस्पष्ट नहीं होगा, और यह "n मिनट" आदि सही ढंग से बहुवचन करेगा।

इसके लायक होने के लिए, बेबेल मॉड्यूल में लोकेल के अनुसार दिनांक और समय स्वरूपण के लिए फ़ंक्शंस भी शामिल हैं, जो समय डेल्टा बड़ा होने पर उपयोगी हो सकता है।

+0

पायथन 3 में ऐसा कैसे करें यदि python3-babel distro repositories में उपलब्ध नहीं है? धन्यवाद। –

5

क्या आप something like this (पायथन में प्रिंटिंग सापेक्ष तिथियां) की तलाश में हैं?

7

या आप आसानी से Django से timesince.py अनुकूलित कर सकते हैं, जिसमें केवल 2 अन्य निर्भरताएं हैं: एक अनुवाद के लिए (जिसे आपको आवश्यकता नहीं हो सकती है) और एक टाइमज़ोन के लिए (जिसे आसानी से अनुकूलित किया जा सकता है)।

वैसे, Django has a BSD license जो कि बहुत लचीला है, आप इसे वर्तमान में उपयोग कर रहे किसी भी प्रोजेक्ट में इसका उपयोग करने में सक्षम होंगे।

35

विशिष्ट में बुकमार्क तिथियां दिलचस्प हैं क्योंकि वे केवल पहले दिन के लिए रिश्तेदार हैं। 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) 
+0

आपका समाधान अब तक का सबसे छोटा और सबसे सुरुचिपूर्ण है। यह सिर्फ तात्पर्य है कि हमें सभी तारों का अनुवाद करना होगा। लेकिन मैं वह ले जाऊंगा, धन्यवाद! –

7

वहाँ the humanize package है:

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

    इसके अलावा (ऊपर लिंक देखें) यह भी के मानवीकरण का समर्थन करता है

  • फ़ाइल (आंशिक नंबरों के लिए) आकार
  • तैरता
संबंधित मुद्दे