ما هي أبسط طريقة للعثور على الفرق بين مرتين في بيثون؟
سؤال
لدي قيمتان زمنيتان لهما النوع datetime.time
.أريد أن أجد الفرق بينهما.الشيء الواضح الذي يجب فعله هو t1 - t2، لكن هذا لا يعمل.إنه يعمل لكائنات من النوع datetime.datetime
ولكن ليس من أجل datetime.time
.إذن ما هي أفضل طريقة للقيام بذلك؟
المحلول
أولاً، لاحظ أن datetime.time هو وقت من اليوم، مستقل عن يوم معين، وبالتالي فإن الفرق بين أي قيمتين من قيم datetime.time سيكون أقل من 24 ساعة.
تتمثل إحدى الطرق في تحويل قيمتي datetime.time إلى قيم قابلة للمقارنة (مثل المللي ثانية)، والعثور على الفرق.
t1, t2 = datetime.time(...), datetime.time(...)
t1_ms = (t1.hour*60*60 + t1.minute*60 + t1.second)*1000 + t1.microsecond
t2_ms = (t2.hour*60*60 + t2.minute*60 + t2.second)*1000 + t2.microsecond
delta_ms = max([t1_ms, t2_ms]) - min([t1_ms, t2_ms])
انها عرجاء قليلا، لكنه يعمل.
نصائح أخرى
أيضًا أمر سخيف بعض الشيء، ولكن يمكنك محاولة اختيار يوم عشوائي وتضمينه في كل مرة باستخدام datetime.datetime.combine
, ، ثم طرح:
>>> import datetime
>>> t1 = datetime.time(2,3,4)
>>> t2 = datetime.time(18,20,59)
>>> dummydate = datetime.date(2000,1,1)
>>> datetime.datetime.combine(dummydate,t2) - datetime.datetime.combine(dummydate,t1)
datetime.timedelta(0, 58675)
يمكنك تحويل كليهما إلى كائنات تيمدلتا وطرح هذه من بعضها البعض، والتي سوف تعتني بالمرحّلات.على سبيل المثال:
>>> import datetime as dt
>>> t1 = dt.time(23, 5, 5, 5)
>>> t2 = dt.time(10, 5, 5, 5)
>>> dt1 = dt.timedelta(hours=t1.hour, minutes=t1.minute, seconds=t1.second, microseconds=t1.microsecond)
>>> dt2 = dt.timedelta(hours=t2.hour, minutes=t2.minute, seconds=t2.second, microseconds=t2.microsecond)
>>> print(dt1-dt2)
13:00:00
>>> print(dt2-dt1)
-1 day, 11:00:00
>>> print(abs(dt2-dt1))
13:00:00
تحصل كائنات دلتا الوقت السالبة في بايثون على حقل يوم سالب، بينما تكون الحقول الأخرى إيجابية.يمكنك التحقق مسبقًا:تعمل المقارنة على كل من الكائنات الزمنية وكائنات timedelta:
>>> dt2 < dt1
True
>>> t2 < t1
True
بايثون لديها pytz (http://pytz.sourceforge.net) والتي يمكن استخدامها لحساب كائنات "الوقت".إنه يعتني بإزاحات التوقيت الصيفي أيضًا.تحتوي الصفحة أعلاه على عدد من الأمثلة التي توضح استخدام pytz.
يبدو أن هذا غير مدعوم، لأنه لن تكون هناك طريقة جيدة للتعامل مع التجاوزات في datetime.time.أعلم أن هذه ليست إجابة مباشرة، ولكن ربما يستطيع شخص لديه خبرة أكبر في لغة بايثون أن يأخذ هذا أبعد قليلاً.لمزيد من المعلومات، راجع هذا: http://bugs.python.org/issue3250
استرجع الأوقات بالمللي ثانية ثم قم بعملية الطرح.
يبدو أن Environment.TickCount يعمل بشكل جيد إذا كنت بحاجة إلى شيء سريع.
int start = Environment.TickCount
...قم بعمل ما()
int elapsedtime = Environment.TickCount - البداية
جون