จะเปรียบเทียบเวลาใน Python ได้อย่างไร?


106

ฉันเห็นว่าการเปรียบเทียบวันที่สามารถทำได้และก็มีเช่นdatetime.timedelta()กัน แต่ฉันกำลังดิ้นรนเพื่อหาวิธีตรวจสอบว่าเวลาปัจจุบัน ( datetime.datetime.now()) เร็วกว่าช้ากว่าหรือตรงกับเวลาที่กำหนด (เช่น 8.00 น.) โดยไม่คำนึงถึงวันที่


2
ฉันไม่แน่ใจเกี่ยวกับการใส่คำตอบนี้ แต่ฉันใส่ไว้ที่นี่เป็นความคิดเห็น: น่าแปลกใจที่ฉันพบว่า Python ยอมรับการเปรียบเทียบเช่น'23:23:00' > '23:59:00'หรือ'23:23:00' > '23:09:22'เช่นเดียวกับที่คุณทำระหว่างสองdatetime.datetime.now().strftime('%H:%M')ค่า เป็นวิธีที่ดีที่สุดในการเปรียบเทียบระหว่างเวลาหรือไม่? ฉันไม่รู้ ได้ผลหรือไม่? เท่าที่ฉันทดสอบมันใช้งานได้ดี แต่แน่นอน (และแน่นอน): ไม่มีโอกาสใช้สิ่งนี้กับสตริงวันที่และเวลาที่มีเดือนวันธรรมดา
ivanleoncz

คำตอบ:


143

คุณไม่สามารถเปรียบเทียบช่วงเวลาที่เฉพาะเจาะจง (เช่น "ตอนนี้") กับเหตุการณ์ที่เกิดซ้ำที่ไม่ได้กำหนดไว้ (8.00 น. เกิดขึ้นทุกวัน)

คุณสามารถตรวจสอบว่าตอนนี้ก่อนหรือหลัง8.00 น. ของวันนี้ :

>>> import datetime
>>> now = datetime.datetime.now()
>>> today8am = now.replace(hour=8, minute=0, second=0, microsecond=0)
>>> now < today8am
True
>>> now == today8am
False
>>> now > today8am
False

4
คุณอาจต้องการเปลี่ยนการยอมรับคำตอบของPär Wieslander (และโดยทั่วไปควรรอสักสองสามนาทีกว่าที่คุณทำ: P) เนื่องจากมันเจาะจงมากขึ้นสำหรับสิ่งที่คุณถาม

69

คุณสามารถใช้time()วิธีการของdatetimeวัตถุเพื่อรับช่วงเวลาของวันซึ่งคุณสามารถใช้เพื่อเปรียบเทียบได้โดยไม่ต้องคำนึงถึงวันที่:

>>> this_morning = datetime.datetime(2009, 12, 2, 9, 30)
>>> last_night = datetime.datetime(2009, 12, 1, 20, 0)
>>> this_morning.time() < last_night.time()
True

2
ตรวจสอบให้แน่ใจว่าจะทำdatetime.datetime.now().time()อย่าลืมวงเล็บในnow()!
Jose Salvatierra

10

คุณสามารถเปรียบเทียบวัตถุ datetime.datetime ได้โดยตรง

เช่น:

>>> a
datetime.datetime(2009, 12, 2, 10, 24, 34, 198130)
>>> b
datetime.datetime(2009, 12, 2, 10, 24, 36, 910128)
>>> a < b
True
>>> a > b
False
>>> a == a
True
>>> b == b
True
>>> 

5

แรงบันดาลใจจาก Roger Pate:

import datetime
def todayAt (hr, min=0, sec=0, micros=0):
   now = datetime.datetime.now()
   return now.replace(hour=hr, minute=min, second=sec, microsecond=micros)    

# Usage demo1:
print todayAt (17), todayAt (17, 15)

# Usage demo2:    
timeNow = datetime.datetime.now()
if timeNow < todayAt (13):
   print "Too Early"

3

คุณสามารถใช้ Timedelta fuction เพื่อเพิ่มการเปรียบเทียบเวลา x

>>> import datetime 

>>> now = datetime.datetime.now()
>>> after_10_min = now + datetime.timedelta(minutes = 10)
>>> now > after_10_min 

False

เพียงการรวมกันของคำตอบเหล่านี้และโรเจอร์


2

อีกวิธีหนึ่งในการทำเช่นนี้โดยไม่ต้องเพิ่มการอ้างอิงหรือใช้วันที่เวลาคือการคำนวณบางอย่างกับคุณลักษณะของวัตถุเวลา มีชั่วโมงนาทีวินาทีมิลลิวินาทีและเขตเวลา สำหรับการเปรียบเทียบที่ง่ายมากชั่วโมงและนาทีควรเพียงพอ

d = datetime.utcnow()
t = d.time()
print t.hour,t.minute,t.second

ฉันไม่แนะนำให้ทำเช่นนี้เว้นแต่คุณจะมีกรณีการใช้งานที่เรียบง่ายอย่างเหลือเชื่อ สำหรับสิ่งที่ต้องการการรับรู้เขตเวลาหรือการรับรู้วันที่คุณควรใช้วันที่และเวลา



1

วันที่และเวลามีความสามารถในการเปรียบเทียบ

>>> import datetime
>>> import time
>>> a =  datetime.datetime.now()
>>> time.sleep(2.0)
>>> b =  datetime.datetime.now()
>>> print a < b
True
>>> print a == b
False
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.