ما هو المعيار طريقة لإضافة ن ثانية إلى التاريخ والوقت.الوقت في الثعبان ؟

StackOverflow https://stackoverflow.com/questions/100210

  •  01-07-2019
  •  | 
  •  

سؤال

نظرا datetime.time القيمة في بيثون ، هل هناك طريقة قياسية إضافة إلى عدد صحيح من ثانية ، بحيث 11:34:59 + 3 = 11:35:02, على سبيل المثال ؟

هذه واضحة الأفكار لا تعمل:

>>> datetime.time(11, 34, 59) + 3
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'

في النهاية كنت قد كتبت وظائف مثل هذا:

def add_secs_to_time(timeval, secs_to_add):
    secs = timeval.hour * 3600 + timeval.minute * 60 + timeval.second
    secs += secs_to_add
    return datetime.time(secs // 3600, (secs % 3600) // 60, secs % 60)

لا يسعني التفكير في أن أنا في عداد المفقودين أسهل طريقة للقيام بذلك على الرغم من.

ذات الصلة

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

المحلول

يمكنك استخدام كامل datetime المتغيرات مع timedelta, وتوفير دمية التاريخ ثم استخدام time لمجرد الحصول على قيمة الوقت.

على سبيل المثال:

import datetime
a = datetime.datetime(100,1,1,11,34,59)
b = a + datetime.timedelta(0,3) # days, seconds, then other fields.
print a.time()
print b.time()

النتائج في قيم ثلاث ثوان عن بعضها البعض:

11:34:59
11:35:02

يمكنك أيضا أن تختار أكثر قابلية للقراءة

b = a + datetime.timedelta(seconds=3)

إذا كنت تميل ذلك.


إذا كنت بعد وظيفة التي يمكن أن تفعل هذا ، يمكن أن ننظر إلى استخدام addSecs أدناه:

import datetime

def addSecs(tm, secs):
    fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
    fulldate = fulldate + datetime.timedelta(seconds=secs)
    return fulldate.time()

a = datetime.datetime.now().time()
b = addSecs(a, 300)
print a
print b

هذه النواتج:

 09:11:55.775695
 09:16:55

نصائح أخرى

مثل الآخرين هنا قد صرح ، يمكنك فقط استخدام كامل التاريخ والوقت الكائنات في جميع أنحاء:

sometime = get_some_time() # the time to which you want to add 3 seconds
later = (datetime.combine(date.today(), sometime) + timedelta(seconds=3)).time()

ومع ذلك, أعتقد أنه يستحق أن تشرح لماذا الكامل في التاريخ والوقت الكائنات المطلوبة.النظر في ما سيحدث إذا أضفت 2 ساعة إلى الساعة 11 مساء.ما هو الصحيح في السلوك ؟ استثناء لأنه لا يمكن أن يكون لديك وقت أكبر من 11:59?يجب أن التفاف تعود ؟

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

الشيء الصغير, قد تضيف الوضوح إلى تجاوز القيمة الافتراضية ثانية

>>> b = a + datetime.timedelta(seconds=3000)
>>> b
datetime.datetime(1, 1, 1, 12, 24, 59)

شكرا @باكس ديابلو, @bvmou و @عنكب على اقتراح من استخدام كامل datetimes في جميع أنحاء.إذا كان لدي قبول التاريخ والوقت.الوقت الكائنات من مصدر خارجي ، ثم يبدو أن هذا البديل add_secs_to_time() وظيفة:

def add_secs_to_time(timeval, secs_to_add):
    dummy_date = datetime.date(1, 1, 1)
    full_datetime = datetime.datetime.combine(dummy_date, timeval)
    added_datetime = full_datetime + datetime.timedelta(seconds=secs_to_add)
    return added_datetime.time()

هذا مطول رمز يمكن ضغطها إلى هذا بطانة واحدة:

(datetime.datetime.combine(datetime.date(1, 1, 1), timeval) + datetime.timedelta(seconds=secs_to_add)).time()

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

اذا كان يستحق إضافة ملف آخر / التبعية إلى المشروع الخاص بك, لقد كتبت صغيرة الطبقة التي تمتد datetime.time مع القدرة على القيام بعملية حسابية.عندما تذهب بعد منتصف الليل ، فإنه يلتف حول الصفر.الآن "كم من الوقت سوف يكون 24 ساعة من الآن" لديها الكثير من الحالات الزاوية ، بما في ذلك التوقيت الصيفي, قفزة ثانية التاريخية التوقيت التغييرات ، وهلم جرا.ولكن في بعض الأحيان كنت حقا بحاجة بسيطة القضية و هذا ما سوف تفعل.

المثال الخاص بك سوف تكون مكتوبة:

>>> import datetime
>>> import nptime
>>> nptime.nptime(11, 34, 59) + datetime.timedelta(0, 3)
nptime(11, 35, 2)

nptime يرث من datetime.time, لذا أي من هذه الطرق يجب أن تكون قابلة للاستخدام أيضا.

وهو متاح من PyPi كما nptime ("غير متحذلق الوقت") ، أو على جيثب: https://github.com/tgs/nptime

لا يمكنك ببساطة إضافة رقم datetime لأنه من غير الواضح ما هي الوحدة المستخدمة:ثانية, ساعات, أسابيع...

هناك timedelta فئة التلاعب مع التاريخ والوقت. datetime ناقص datetime يعطي timedelta, datetime بالإضافة إلى timedelta يعطي datetime, اثنين datetime كائنات لا يمكن وأضاف على الرغم من أن اثنين timedelta يمكن.

إنشاء timedelta كائن مع كم ثانية تريد إضافة وإضافته إلى datetime وجوه:

>>> from datetime import datetime, timedelta
>>> t = datetime.now() + timedelta(seconds=3000)
>>> print(t)
datetime.datetime(2018, 1, 17, 21, 47, 13, 90244)

هناك هو نفس المفهوم في C++: std::chrono::duration.

للتأكد من اكتمالها في الله ، وهنا طريقة للقيام بذلك مع arrow (أفضل التواريخ والأوقات الخاصة بيثون):

sometime = arrow.now()
abitlater = sometime.shift(seconds=3)

حاول إضافة datetime.datetime إلى datetime.timedelta.إذا كنت تريد فقط جزء الوقت ، time() طريقة عنها datetime.datetime كائن للحصول عليه.

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