ทำความเข้าใจกับเวลา


90

รับรหัส python ด้านล่างโปรดช่วยฉันเข้าใจว่าเกิดอะไรขึ้นที่นั่น

start_time = time.time()
time.sleep(42)
end_time = time.time()

uptime = end_time - start_time

human_uptime = str(datetime.timedelta(seconds=int(uptime)))

ดังนั้นฉันจึงได้ความแตกต่างระหว่างstart timeและend timeในบรรทัดที่ 5 ฉันจะปัดเศษระยะเวลาโดยการแคสต์และอะไรคือสิ่งที่มีคำอธิบายเพิ่มเติม

ฉันรู้ว่าสิ่งเดลต้าหมายถึง (ค่าเฉลี่ยหรือแตกต่างกัน) แต่ทำไมฉันต้องผ่านseconds = uptimeไปtimedeltaและทำไมไม่หล่อสตริงทำงานได้อย่างที่ฉันได้รับHH:MM:SS?

คำตอบ:


115

เนื่องจาก timedelta ถูกกำหนดไว้เช่น:

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

อาร์กิวเมนต์ทั้งหมดเป็นทางเลือกและมีค่าเริ่มต้นเป็น 0

คุณสามารถพูดว่า "สามวันสี่มิลลิวินาที" ได้ง่ายๆโดยมีอาร์กิวเมนต์ที่เป็นทางเลือกในลักษณะนั้น

>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)

และสำหรับการหล่อแบบ str จะส่งคืนค่าที่มีรูปแบบที่ดีแทนที่จะ__repr__ช่วยเพิ่มความสามารถในการอ่าน จากเอกสาร:

str (t) ส่งคืนสตริงในรูปแบบ [D day [s],] [H] H: MM: SS [.UUUUUU] โดยที่ D เป็นลบสำหรับค่าลบ t (5)

>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'

เอกสารการชำระเงิน:

http://docs.python.org/library/datetime.html#timedelta-objects


13

ทำไมฉันต้องผ่าน seconds = uptime ถึง timedelta

เนื่องจากวัตถุที่กำหนดเวลาสามารถผ่านไปได้เป็นวินาทีมิลลิวินาทีวัน ฯลฯ ... ดังนั้นคุณต้องระบุสิ่งที่คุณกำลังส่งผ่าน (นี่คือเหตุผลที่คุณใช้คีย์ที่ชัดเจน) การพิมพ์ดีดintเป็นฟุ่มเฟือยเนื่องจากสามารถรับลอยได้

แล้วทำไมการแคสต์สตริงถึงได้ผลดีมากจนได้ HH: MM: SS?

ไม่ใช่การพิมพ์ที่จัดรูปแบบเป็น__str__วิธีการภายในของวัตถุ ในความเป็นจริงคุณจะได้ผลลัพธ์เดียวกันหากคุณเขียน:

print datetime.timedelta(seconds=int(uptime))

1
คุณบอกใบ้สิ่งนี้ แต่ก็ควรสังเกตอย่างชัดเจนว่า timedelta ทำอะไรได้มากกว่าการแสดงสิ่งต่างๆในรูปแบบ HH: MM: SS อ็อบเจ็กต์ timedelta ถูกใช้เมื่อใดก็ตามที่คุณต้องการสร้างความแตกต่างระหว่างอ็อบเจ็กต์ datetime สองอ็อบเจ็กต์
Wilduck

1
ไม่ใช่__repr__วิธีการ แต่เป็น__str__วิธีการ
utdemir

1
ไม่ใช่__repr__()ของ timedelta แต่เป็น__str__()วิธีการของมัน printเรียก__str()__หาคุณ
bgporter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.