2010-03-13 10 views
11

आप अगले शुक्रवार को 0amऑब्जेक्ट के रूप में 3am पर कैसे गणना कर सकते हैं?अगले शुक्रवार को 3 बजे की गणना कैसे करें?

स्पष्टीकरण:

def _next_weekday(day_of_week=4, time_of_day=datetime.time(hour=3), dt=None): 
    if dt is None: dt = datetime.datetime.now() 
    dt += datetime.timedelta(days=7) 
    if dt.time() < time_of_day: dt = dt.combine(dt.date(), time_of_day) 
    else: dt = dt.combine(dt.date(), time_of_day) + datetime.timedelta(days=1) 
    return dt + datetime.timedelta((day_of_week - dt.weekday()) % 7) 
:
यानी, गणना की तारीख हमेशा 7 दिन से दूर अधिक से अधिक है, और कम से कम या 14.


के बराबर Mark's solution का एक थोड़ा संशोधित संस्करण के साथ जा रहे हैं होना चाहिए

+3

हुह? .......... –

+0

क्या यह सोमवार के बारे में है? क्या अब से 4 दिनों की गणना करनी चाहिए? या अब से 11 दिन? और अब से 5 दिन रविवार है? कृपया स्पष्ट करें! – Tom

+0

जोड़ा गया स्पष्टीकरण – mpen

उत्तर

6

यहाँ एक समारोह और एक परीक्षण है कि यह ओ पी की जरूरतों को पूरा करती है:

import datetime 

_3AM = datetime.time(hour=3) 
_FRI = 4 # Monday=0 for weekday() 

def next_friday_3am(now): 
    now += datetime.timedelta(days=7) 
    if now.time() < _3AM: 
     now = now.combine(now.date(),_3AM) 
    else: 
     now = now.combine(now.date(),_3AM) + datetime.timedelta(days=1) 
    return now + datetime.timedelta((_FRI - now.weekday()) % 7) 

if __name__ == '__main__': 
    start = datetime.datetime.now() 
    for i in xrange(7*24*60*60): 
     now = start + datetime.timedelta(seconds=i) 
     then = next_friday_3am(now) 
     assert datetime.timedelta(days=7) < then - now <= datetime.timedelta(days=14) 
     assert then.weekday() == _FRI 
     assert then.time() == _3AM 
+0

हाहा ... बहुत व्यापक परीक्षण। मैं सोच रहा था कि जब तक मैं इसे पढ़ता हूं तब तक दौड़ने में इतनी देर लग रही थी: डी – mpen

+0

मुझे वास्तव में यह समाधान पसंद है। किसी अन्य पुस्तकालय पर निर्भर नहीं है, और यह बस अन्य दिनों/समय के लिए संशोधित करने के लिए है। – mpen

9

यदि आप dateutil इंस्टॉल करते हैं, तो आप ऐसा कुछ कर सकते हैं:

import datetime 
import dateutil.relativedelta as reldate 

def following_friday(dt): 
    rd=reldate.relativedelta(
     weekday=reldate.FR(+2), 
     hours=+21) 
    rd2=reldate.relativedelta(
     hour=3,minute=0,second=0,microsecond=0) 
    return dt+rd+rd2 

ऊपर, hours=+21 अगले शुक्रवार को 21 घंटे पहले dt को बढ़ाने के लिए relativedelta बताता है। इसलिए, यदि dt 12 मार्च, 2010 को दोपहर 2 बजे है, तो 21 घंटे इसे 1112 उसी दिन बनाता है, लेकिन dt 3 बजे के बाद है, तो 21 घंटे जोड़कर dt शनिवार को धक्का देता है।

यहां कुछ परीक्षण कोड दिए गए हैं।

if __name__=='__main__': 
    today=datetime.datetime.now() 
    for dt in [today+datetime.timedelta(days=i) for i in range(-7,8)]: 
     print('%s --> %s'%(dt,following_friday(dt))) 

पैदावार जो:

2010-03-05 20:42:09.246124 --> 2010-03-19 03:00:00 
2010-03-06 20:42:09.246124 --> 2010-03-19 03:00:00 
2010-03-07 20:42:09.246124 --> 2010-03-19 03:00:00 
2010-03-08 20:42:09.246124 --> 2010-03-19 03:00:00 
2010-03-09 20:42:09.246124 --> 2010-03-19 03:00:00 
2010-03-10 20:42:09.246124 --> 2010-03-19 03:00:00 
2010-03-11 20:42:09.246124 --> 2010-03-19 03:00:00 
2010-03-12 20:42:09.246124 --> 2010-03-26 03:00:00 
2010-03-13 20:42:09.246124 --> 2010-03-26 03:00:00 
2010-03-14 20:42:09.246124 --> 2010-03-26 03:00:00 
2010-03-15 20:42:09.246124 --> 2010-03-26 03:00:00 
2010-03-16 20:42:09.246124 --> 2010-03-26 03:00:00 
2010-03-17 20:42:09.246124 --> 2010-03-26 03:00:00 
2010-03-18 20:42:09.246124 --> 2010-03-26 03:00:00 
2010-03-19 20:42:09.246124 --> 2010-04-02 03:00:00 

जबकि 3:00 से पहले:

two = datetime.datetime(2010, 3, 12, 2, 0) 
for date in [two+datetime.timedelta(days=i) for i in range(-7,8)]: 
    result = following_friday(date) 
    print('{0}-->{1}'.format(date,result)) 

पैदावार:

2010-03-05 02:00:00-->2010-03-12 03:00:00 
2010-03-06 02:00:00-->2010-03-19 03:00:00 
2010-03-07 02:00:00-->2010-03-19 03:00:00 
2010-03-08 02:00:00-->2010-03-19 03:00:00 
2010-03-09 02:00:00-->2010-03-19 03:00:00 
2010-03-10 02:00:00-->2010-03-19 03:00:00 
2010-03-11 02:00:00-->2010-03-19 03:00:00 
2010-03-12 02:00:00-->2010-03-19 03:00:00 
2010-03-13 02:00:00-->2010-03-26 03:00:00 
2010-03-14 02:00:00-->2010-03-26 03:00:00 
2010-03-15 02:00:00-->2010-03-26 03:00:00 
2010-03-16 02:00:00-->2010-03-26 03:00:00 
2010-03-17 02:00:00-->2010-03-26 03:00:00 
2010-03-18 02:00:00-->2010-03-26 03:00:00 
2010-03-19 02:00:00-->2010-03-26 03:00:00 
+0

'relativedelta' भी पूर्ण मान लेता है जैसे' घंटा', 'मिनट', इत्यादि। इस तरह आप एक डेल्टा उत्पन्न कर सकते हैं जो आपके परिणाम पर घंटे और मिनट और सेकंड भी 3am तेज सेट करेगा। देखें: http://labix.org/python-dateutil#head-6a1472b7c74e5b8bab7784f11214250d34e09aa5 –

+0

एएके! मेरा मतलब यह नहीं था कि गुरुवार एक विशेष मामला था, यह सिर्फ एक उदाहरण था। हालांकि, अगर हम +7 के साथ +2 को प्रतिस्थापित करते हैं .... इसे सही काम करना चाहिए? – mpen

+1

@ मार्क: मैंने आशा व्यक्त की है कि आप जो चाहते हैं उसके अनुरूप हो। यदि मैं सही ढंग से समझता हूं तो 'दिन = + 8' इसे करना चाहिए। – unutbu

4

मैं सामान्य रूप में इस तरह के कार्यों के लिए dateutil पसंद है, लेकिन मैं डॉन ' t समझ आप चाहते हैं कि ह्यूरिस्टिक्स - जैसा कि मैं "अगली शुक्रवार" कहता हूं, और मैं गुरुवार को का मतलब कल (शायद मैं बहुत कठिन काम कर रहा हूं और सप्ताह के किस दिन का ट्रैक खो गया हूं)। यदि आप अपने हेरिस्टिक्स को कठोर रूप से निर्दिष्ट कर सकते हैं, तो निश्चित रूप से वे निश्चित रूप से प्रोग्राम किए जा सकते हैं, लेकिन यदि वे अजीब और विचित्र हैं तो आप मौजूदा पैकेजों में पहले से ही आपके लिए पूर्व-प्रोग्राम किए गए हैं ;-)।

+0

मुझे पता नहीं, लोग "अगली" शब्द का प्रयोग अस्पष्टता से करते हैं। आम तौर पर, लोग "इस शुक्रवार" का मतलब "शुक्रवार को आने वाले, इस सप्ताह के भीतर एक" और "अगले शुक्रवार" का अर्थ है "अगले सप्ताह में रहने वाले शुक्रवार" का अर्थ है। मैं बस बाद वाला मतलब है। – mpen

+0

मैंने "अगली शुक्रवार" जैसे वाक्यांशों की बात करते समय "अगली" का अर्थ क्या है, इसके बारे में विभिन्न लोगों के साथ तर्क दिया है। मेरे लिए, सबसे अधिक समझ में आने वाली व्याख्या आज के बाद पहली शुक्रवार होगी, लेकिन हर किसी को लगता है कि इसका मतलब है कि इसका मतलब आज दूसरे शुक्रवार को है। उन लोगों के अनुसार, आप आज के पहले शुक्रवार को संदर्भित करने के लिए "इस शुक्रवार" कहेंगे। – allyourcode

2

अपने स्पष्टीकरण के आधार पर ... मुझे लगता है कि आप कुछ इस तरह कर सकते हैं:

from datetime import * 
>>> today = datetime.today() 
>>> todayAtThreeAm = datetime(today.year, today.month, today.day, 3) 
>>> todayAtThreeAm 
datetime.datetime(2010, 3, 12, 3, 0) 
>>> nextFridayAtThreeAm = todayAtThreeAm + timedelta(12 - today.isoweekday()) 
>>> nextFridayAtThreeAm 
datetime.datetime(2010, 3, 19, 3, 0) 

सूचना सोमवार से रविवार तक के लिए isoweekday() रिटर्न 1 से 7। 12 अगले सप्ताह के शुक्रवार का प्रतिनिधित्व करता है। तो 12 - आज .isoweekday() आपको सही समय डेल्टा देता है जिसे आपको आज जोड़ना होगा।

उम्मीद है कि इससे मदद मिलती है।

+0

मुझे लगता है कि यह गलत है। यह वास्तव में 26 मार्च को वापस आना चाहिए, क्योंकि यह वर्तमान में शुक्रवार को 3 बजे के बाद है। याद रखें कि यह 7 दिनों से सख्ती से अधिक होना चाहिए :) – mpen

+0

शायद एक सशर्त ऐसा करेगा? 'दिन = 12 today.isoweekday(); यदि दिन <= 7: दिन + = 7'? – mpen

संबंधित मुद्दे