วิธีการรับวินาทีตั้งแต่ยุคจากเวลา + วันที่ส่งออกของ gmtime ()?


162

คุณจะย้อนกลับอย่างไรgmtime()ที่คุณใส่เวลา + วันที่และรับจำนวนวินาที?

ฉันมีสตริงเช่น'Jul 9, 2009 @ 20:02:58 UTC'และฉันต้องการกลับจำนวนวินาทีระหว่างกาลและ 9 กรกฎาคม 2009

ฉันได้ลองแล้วtime.strftimeแต่ฉันไม่รู้วิธีใช้อย่างถูกต้องหรือเป็นคำสั่งที่ถูกต้องที่จะใช้

คำตอบ:


123

หากคุณมาที่นี่เพราะเครื่องมือค้นหาบอกคุณว่านี่เป็นวิธีการบันทึกเวลา Unix หยุดอ่านคำตอบนี้ เลื่อนลงหนึ่ง

หากคุณต้องการที่จะย้อนกลับที่คุณต้องการtime.gmtime()calendar.timegm()

>>> calendar.timegm(time.gmtime())
1293581619.0

คุณสามารถเปลี่ยนสตริงของคุณให้กลายเป็น time tuple ด้วยtime.strptime()ซึ่งจะคืนค่า tuple ที่คุณสามารถส่งผ่านไปยังcalendar.timegm():

>>> import calendar
>>> import time
>>> calendar.timegm(time.strptime('Jul 9, 2009 @ 20:02:58 UTC', '%b %d, %Y @ %H:%M:%S UTC'))
1247169778

ข้อมูลเพิ่มเติมเกี่ยวกับโมดูลปฏิทินที่นี่


16
หากคุณกำลังมองหาเวลา unix ยุคปัจจุบันโปรดดูความคิดเห็นของ @ DanJ หรือคำตอบของ naren คำตอบนี้ไม่ถูกต้อง!
kosii

641

ใช้โมดูลเวลา :

epoch_time = int(time.time())

14
@DanJ: มันเป็นจำนวนวินาทีที่ผ่านไปนับตั้งแต่ Epoch (ช่วงเวลาที่แน่นอนในเวลา) และมันจะเหมือนกันในเขตเวลาใดก็ได้ แม้ว่าถ้าเราไม่สนใจอินสแตนซ์เวลาประมาณวินาทีกระโดด มันง่ายที่จะแปลงเป็น UTC ถ้าtimeใช้ Unix epoch (1970)
jfs

43
โปรดทราบว่านี่ไม่ใช่สิ่งที่ OP ร้องขอ แต่เป็นสิ่งที่ฉันต้องการ ดังนั้น +1
fearless_fool

6
มันเป็นคำตอบของสิ่งที่ถูกถามในชื่อเรื่อง: "ได้รับเวลาตั้งแต่ยุค" +1
AlejandroVD

@JFSebastian สิ่งนี้ให้เวลาในวินาที ฉันจะได้รับความละเอียดไม่เกินหนึ่งไมล์โดยใช้คำตอบข้างต้นเดียวกันได้อย่างไร
Marlon Abeykoon

2
เพื่อขยายความคิดเห็นของฉันด้านบน : time.time()ค่าไม่ขึ้นอยู่กับเขตเวลาท้องถิ่น (หากเรายกเว้นเขตเวลา "ถูกต้อง" และอื่น ๆ ) เช่นถ้าส่งคืนเวลา POSIX (เช่นเดียวกับในระบบส่วนใหญ่) ดังนั้นจึงเป็นจำนวน SI วินาทีตั้งแต่ Epoch (1970-01-01UTC) ไม่นับวินาทีกระโดด ค่านี้สามารถถูกแปลงเป็น UTC (ไม่รวมเผ่นวินาที) แต่มันไม่ได้เป็นเวลา UTC @MarlonAbeykoon: ฉันชอบคำตอบนี้
jfs

10

โปรดทราบว่าtime.gmtimeแผนที่การประทับเวลาที่จะ01970-1-1 00:00:00

In [61]: import time       
In [63]: time.gmtime(0)
Out[63]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

time.mktime(time.gmtime(0)) ช่วยให้คุณเปลี่ยนเวลาตามจำนวนที่ขึ้นอยู่กับสถานที่ของคุณซึ่งโดยทั่วไปอาจไม่ใช่ 0

In [64]: time.mktime(time.gmtime(0))
Out[64]: 18000.0

สิ่งที่ตรงกันข้ามของtime.gmtimeคือcalendar.timegm:

In [62]: import calendar    
In [65]: calendar.timegm(time.gmtime(0))
Out[65]: 0

สิ่งนี้ให้คำอธิบายและตัวอย่างที่ดีกว่าแก่ time.mktime (ซึ่งคำนึงถึงเขตเวลาปัจจุบันด้วย) ขอบคุณ
Jkm

@Jkm: อย่าใช้กับmktime() ยอมรับเวลาท้องถิ่นของคุณแต่กลับเวลา UTC - เขตเวลาท้องถิ่นของคุณอาจและแตกต่างกัน "การประทับเวลาที่สัมพันธ์กับสถานที่ของคุณ" ไม่สมเหตุสมผล: การประทับเวลา POSIX ไม่ได้ขึ้นอยู่กับสถานที่ของคุณ (เขตเวลาท้องถิ่น) - มันเป็นค่าเดียวกันทั่วโลก "วินาทีนับตั้งแต่ยุค" เป็นเวลาประทับ POSIX ในกรณีส่วนใหญ่ (แม้กระทั่งบน Windows) - เช่นเขตเวลา "ถูกต้อง" ที่ใช้มาตราส่วนเวลา TAI นั้นไม่ธรรมดา ดูPython time.time () ส่งคืนเวลาท้องถิ่นหรือเวลา UTC หรือไม่ gmtime()mktime()gmtime()
jfs

@JF Sebastian คุณพูดถูก จริงๆแล้วฉันมีปัญหาเล็กน้อยเกี่ยวกับmktime()เมื่อเร็ว ๆ นี้ สำหรับเว็บเซิร์ฟเวอร์บางไพ ธ อน (ตัวอย่างเช่นทอร์นาโด) เนื่องจากกระบวนการทำงานต่อเนื่องแม้ว่าฉันจะเปลี่ยนโลแคลระบบการmktime()เรียกใช้โดยเว็บเซิร์ฟเวอร์ API ยังคงใช้เขตเวลาเก่าเพื่อสร้างวัตถุเวลา ฉันต้องเปลี่ยนไปgmtime()ใช้ gmt offset ด้วยตนเอง
Jkm

5
ep = datetime.datetime(1970,1,1,0,0,0)
x = (datetime.datetime.utcnow()- ep).total_seconds()

สิ่งนี้ควรแตกต่างจากint(time.time())แต่ก็ปลอดภัยที่จะใช้สิ่งที่ชอบx % (60*60*24)

วันที่และเวลา - ประเภทวันที่และเวลาพื้นฐาน:

แตกต่างจากโมดูลเวลาโมดูล datetime ไม่สนับสนุนวินาทีกระโดด


3
t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")

ฉันไม่สามารถเข้าถึง strptime ได้ด้วยเหตุผลบางอย่าง ฉันได้นำเข้า
ข้อมูล

1
@calccrypto คุณต้องfrom datetime import datetimeทำหรือทำอย่างใดอย่างหนึ่งdatetime.datetime.strptime
pathikrit

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