Python time.time () ส่งคืนเวลาท้องถิ่นหรือ UTC


559

ไม่time.time()ในโมดูลเวลาหลามกลับเวลาของระบบหรือเวลาใน UTC หรือไม่


87
Timestamps ไม่มีเขตเวลา มันแสดงถึงจำนวนวินาทีตั้งแต่ยุค ยุคคือช่วงเวลาที่เฉพาะเจาะจงซึ่งไม่ได้ขึ้นอยู่กับเขตเวลา
jwg

2
@jwg: การประทับเวลา POSIX ที่ใช้กันทั่วไปจะไม่นับวินาทีกระโดดและดังนั้นพวกเขาจึงไม่ใช่ "จำนวน [วินาทีที่ผ่านไปแล้ว] นับตั้งแต่ยุค" (ใกล้เคียง)
jfs

7
ฉันไม่คิดว่านี่เป็นคำคัดค้านที่ถูกต้อง @JFSebastian Leap วินาทีไม่ใช่ 'วินาทีที่ผ่านไปนับตั้งแต่ยุค' เป็นการเปลี่ยนแปลงในการแสดงเวลาที่บันทึกโดยนาฬิกาซึ่งไม่ตรงกับวินาทีที่ผ่านไป
jwg

4
@JFSebastian ขออภัยในความสับสน Leap วินาทีไม่ใช่ 'วินาทีที่ผ่านไป' ดังนั้นการประทับเวลาซึ่งเป็น 'จำนวนวินาทีที่ผ่านไป' จึงไม่ควรรวมการกระโดดวินาที
jwg

2
@jwg ผิด คุณไม่สามารถลบเวลาทางกายภาพ เวลาประทับ POSIX ไม่ใช่จำนวน SI วินาทีที่ผ่านไป นี่คือตัวอย่าง: 3 วินาทีผ่านไประหว่าง "31 ธันวาคม 2016 เวลา 6:59:59 น." และ "31 ธันวาคม 2016 เวลา 7:00:01 น." ในนิวยอร์ก แต่ความแตกต่างในการประทับเวลา POSIX ที่สอดคล้องกันเพียง 2 วินาที ( การกระโดดครั้งที่สองจะไม่ถูกนับ)
jfs

คำตอบ:


780

time.time()ฟังก์ชันส่งกลับจำนวนวินาทีตั้งแต่ยุคที่เป็นวินาที โปรดทราบว่า "ยุค" ถูกกำหนดให้เป็นจุดเริ่มต้นของวันที่ 1 มกราคม 1970 ใน UTC ดังนั้นยุคที่กำหนดไว้ในแง่ของ UTC และสร้างช่วงเวลาที่ทั่วโลกในเวลา ไม่ว่าคุณจะอยู่ที่ไหน "วินาทีที่ผ่านมายุค" (time.time ()) จะส่งกลับค่าเดียวกันในช่วงเวลาเดียวกัน

นี่คือเอาต์พุตตัวอย่างบางส่วนที่ฉันรันบนคอมพิวเตอร์ของฉันแปลงเป็นสตริงเช่นกัน

Python 2.7.3 (default, Apr 24 2012, 00:00:54) 
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>

tsตัวแปรเวลากลับมาในไม่กี่วินาที จากนั้นฉันแปลงเป็นสตริงโดยใช้datetimeไลบรารีทำให้เป็นสตริงที่มนุษย์สามารถอ่านได้


72
ทำไมเราถึงควรimport timeเมื่อ datetime ให้เวลาคุณโดยทั่วไป เพียงแค่ลบมิลลิวินาที -str(datetime.datetime.now()).split('.')[0]
Hussain

17
@Alexis Unix ยุคที่มีการกำหนดไว้อย่างชัดเจนสวยที่นี่ มันยังชี้ให้เห็นถึงตัวอย่างของ Python ในหน้าเว็บ ฉันไม่เข้าใจความคิดเห็นของคุณ
squiguy

9
@squiguy พูดตามตรงฉันจำไม่ได้ว่าอะไรทำให้ฉันพูดแบบนั้น ฉันต้องอ่านอะไรผิดพลาดและฉันพยายามดิ้นรนหาสาเหตุว่าทำไมการทดสอบบางอย่างถึงขาดในขณะที่ฉันย้ายไปมาระหว่างฝรั่งเศสและสหรัฐอเมริกาในที่สุดก็พบว่าปัญหานี้เกิดขึ้นเนื่องจาก DST ที่ทำให้สัปดาห์นี้ยาวนานขึ้นในช่วงเวลานี้ของปี ขออภัยเกี่ยวกับเรื่องนี้และขอขอบคุณสำหรับการชี้ให้เห็น
Alexis

5
ไม่ใช่"วินาทีใน UTC" . การประทับเวลาที่ส่งกลับโดยtime.time()ไม่ได้อยู่ในเขตเวลาใด"วินาทีนับตั้งแต่ยุค" เป็นคำ; มันไม่ได้ผ่านไปกี่วินาทีนับตั้งแต่เวลา (ยุค) คุณสามารถแปลงเป็นเวลาท้องถิ่นของคุณ (พร้อมฐานข้อมูล tz) และ / หรือ UTC เขตเวลาได้อย่างง่ายดาย btw หากคุณลดลง.strftime()ผลลัพธ์คือ (เกือบ) เหมือนกัน (+/- microseconds)
jfs

3
เพิ่งทดสอบแล้ว time.time () ไม่ให้เวลา UTC มันให้เวลาท้องถิ่นของฉัน
sliders_alpha

301

นี่เป็นรูปแบบข้อความของการประทับเวลาที่สามารถใช้ในไฟล์ข้อความของคุณ (ชื่อคำถามมีความแตกต่างในอดีตดังนั้นคำแนะนำเกี่ยวกับคำตอบนี้จึงเปลี่ยนเพื่อให้ชัดเจนว่ามันสามารถตีความได้อย่างไรในเวลา [อัพเดท 2016-01-14]

คุณสามารถรับการประทับเวลาเป็นสตริงโดยใช้.now()หรือ.utcnow()ของdatetime.datetime:

>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000

ความnowแตกต่างจากutcnowที่คาดไว้ - มิฉะนั้นจะทำงานในลักษณะเดียวกัน:

>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000

คุณสามารถสร้างการประทับเวลาให้กับสตริงได้อย่างชัดเจน:

>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'

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

>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'

หากคุณต้องการรูปแบบ ISO ให้ใช้.isoformat()วิธีการของวัตถุ:

>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'

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

>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980

1
ฉันต้องการเวลายุค .... ไม่อยู่ในรูปแบบวันที่ ... ตามที่เห็นได้ชัดจากการกล่าวถึง time.time เวลาของฉัน ()
Saransh Mohapatra

34
ได้ไม่มีปัญหา. บางคนอาจต้องการการประทับเวลาเพื่อบอกว่าอยู่ในไฟล์ข้อความ
pepr

1
ฉันเป็นอีกคนหนึ่งซึ่งเปลี่ยนเส้นทางมาที่นี่เนื่องจากมีจำนวนอัปโหลดไม่สมเหตุสมผล คำถามนี้มีรูปแบบไม่ถูกต้องและคำตอบที่ยอมรับได้ทำให้เข้าใจผิดสำหรับความต้องการทั่วไป: การขอคำต่อท้ายที่มนุษย์สามารถอ่านได้ - พูดสำหรับชื่อไฟล์ - ในเขตเวลาของเซิร์ฟเวอร์ที่ใช้มากที่สุด

หากต้องการพิมพ์การประทับเวลาเป็นส่วนหนึ่งของสตริงให้ใช้สิ่งนี้: Python2: import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
Mr-IDE

datetime.datetime.utcnow()คือความชั่วร้าย มันสร้าง datetime ไร้เดียงสาที่ไม่ใช่เวลาท้องถิ่น เว้นแต่เวลาท้องถิ่นของคุณคือ UTC จะไม่ถูกต้อง ใช้datetime.datetime.now(datetime.timezone.utc)แทน สิ่งนี้จะสร้างวันที่และเวลาที่รับรู้ถึงเขตเวลาซึ่งแทนเวลาปัจจุบัน
Terrel Shumway

139

จากคำตอบจาก #squiguy เพื่อให้ได้เวลาประทับจริงฉันจะพิมพ์ cast จาก float

>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318

อย่างน้อยนั่นคือแนวคิด


1
อะไรคือสาเหตุของการพิมพ์เวลาประทับ ประเภทเริ่มต้นคืออะไร
Tizzee

3
@Tizzee type(time.time())ให้<type 'float'>
famousgarkin

4
แต่ถ้าคุณต้องการเวลาที่แม่นยำมากขึ้นกว่าในไม่กี่วินาทีทุ่นก็เข้าท่า
pepr

3
@RudiStrydom: Python พิมพ์เป็นอย่างมาก อย่าสับสนกับการพิมพ์แบบคงที่
jfs

1
@CheokYanCheng: int()เป็น polymorphic มันจะกลับมาlongถ้าจำเป็นกับ Python เวอร์ชั่นเก่า - จำนวนเต็มทั้งหมดจะยาวกับ Python เวอร์ชั่นใหม่
jfs

30

คำตอบอาจไม่ใช่หรือทั้งสองอย่าง

  • ไม่ใช่: time.time()ส่งคืนประมาณจำนวนวินาทีที่ผ่านไปนับตั้งแต่ยุค ผลลัพธ์ไม่ได้ขึ้นอยู่กับเขตเวลาดังนั้นจึงไม่ใช่ UTC หรือเวลาท้องถิ่น นี่คือPOSIX defintion สำหรับ "วินาทีตั้งแต่ยุค"

  • ทั้งคู่: time.time()ไม่ต้องการให้ซิงโครไนซ์นาฬิกาของระบบของคุณดังนั้นมันจึงแสดงค่าของมัน (แม้ว่ามันจะไม่เกี่ยวข้องกับเขตเวลาท้องถิ่น) คอมพิวเตอร์ที่แตกต่างกันอาจได้รับผลลัพธ์ที่แตกต่างกันในเวลาเดียวกัน ในทางตรงกันข้ามถ้ามีเวลาเครื่องคอมพิวเตอร์ของคุณจะทำข้อมูลให้ตรงกันแล้วมันเป็นเรื่องง่ายที่จะได้รับเวลา UTC จากการประทับเวลา (ถ้าเราไม่สนใจเผ่นวินาที):

    from datetime import datetime
    
    utc_dt = datetime.utcfromtimestamp(timestamp)

เกี่ยวกับวิธีรับการประทับเวลาจากเวลา UTC ในเวอร์ชัน Python ต่างๆดูที่ฉันจะรับวันที่แปลงเป็นวินาทีตั้งแต่เวลาตามยุคตาม UTC ได้อย่างไร


4
นี่เป็นคำตอบเดียวที่ถูกกล่าวถึงอย่างถูกต้องdatetime.utcfromtimestampในขณะที่มี upvotes 308 รายการสำหรับคำตอบด้วยdatetime.fromtimestamp:-(

@TerrelShumway คำถามเกี่ยวกับสิ่งที่time.time()ฟังก์ชั่นกลับมา (มันสั้นมาก) ความคิดเห็นของคุณตอบคำถามอื่น ๆ (คุณเปลี่ยนความคิดเห็นของคุณตั้งแต่ฉันเริ่มตอบรับแล้วแย่กว่านั้น) บันทึกนอกเหนือ; ควรใช้คำว่า "ถูกต้อง" เท่าที่จำเป็น (เขตเวลามีความซับซ้อน - ไม่มีสัญลักษณ์แสดงหัวข้อย่อยสีเงิน - เป็นการแลกเปลี่ยนเฉพาะสำหรับกรณีการใช้งานเฉพาะ)
jfs

datetime.datetime.utcfromtimestamp(ts)อย่าใช้ เว้นแต่เวลาท้องถิ่นของคุณคือ UTC จะไม่ถูกต้องเพราะจะสร้างวันที่และเวลาที่ไม่ได้เป็นเวลาท้องถิ่น ใช้datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)แทน สิ่งนี้สร้างวันที่และเวลาที่รับรู้ของเขตเวลาซึ่งแสดงถึงอินสแตนซ์เดียวกับเวลาประทับ
Terrel Shumway

ใช่. ความคิดเห็นก่อนหน้าของฉันผิดไปแล้ว รหัสส่วนใหญ่ในโมดูล datetime ใช้ชุดข้อมูลที่ไร้เดียงสาตามเวลาท้องถิ่น การใช้ชุดข้อมูลที่ไร้เดียงสาก็เหมือนกับการเปิดไฟล์ข้อความโดยไม่ทราบการเข้ารหัส
Terrel Shumway

@TerrelShumway มันผิดที่คิดว่าเวลา UTC อาจใช้กับระบบที่เป็นเวลาท้องถิ่นเท่านั้น มันเป็นความจริงที่บางส่วนของ stdlib ปฏิบัติต่อวัตถุ datetime ที่ไร้เดียงสาว่ามีเขตเวลาท้องถิ่น (อย่างน่าเศร้า) ฉันต้องการที่naive_dt.astimezone()จะไม่มีอยู่จริงโดยปริยายbytes.encode()ไม่มีอยู่ใน Python 3 อีกต่อไปมันเป็นความจริงที่เป็นประโยชน์ต่อการทำงานกับเวลา UTC ภายในหลายกรณี มีหลายสิ่งหลายอย่างที่สามารถพูดได้เกี่ยวกับโมดูลวันที่และเวลา (ฉันตอบคำถามมากพอที่จะรับตราทอง) ส่วนใหญ่อยู่นอกขอบเขตสำหรับคำถาม: สิ่งที่time.time()ส่งกลับ
jfs

4

ในที่สุดฉันก็ตัดสินให้:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0

1
นั่นอาจตอบสนองความต้องการในท้องถิ่นของคุณ แต่อาจทำให้เข้าใจผิดว่าผู้คนคาดหวังว่าตัวเลขในช่วงนั้นจะเป็นวินาทีตั้งแต่ยุค [GMT] time.time()ผลตอบแทนทศนิยม / ลอยเหมือน1574115250.818733และมิลลิวินาทีตั้งแต่ยุค-เป็นได้อย่างง่ายดายint(time.time() * 1000)เช่น1574115254915
MarkHu

3

ไม่มีสิ่งเช่น "ยุค" ในเขตเวลาที่เฉพาะเจาะจง ยุคมีการกำหนดไว้อย่างดีว่าเป็นช่วงเวลาที่เฉพาะเจาะจงดังนั้นหากคุณเปลี่ยนเขตเวลาเวลาก็จะเปลี่ยนไปเช่นกัน Jan 1 1970 00:00:00 UTCโดยเฉพาะเวลานี้คือ ดังนั้นtime.time()ส่งกลับจำนวนวินาทีตั้งแต่ยุค


ในขณะที่มันเป็นจริงว่า UTC เป็นมาตรฐานเวลาและไม่ใช่โซนเวลามาตรฐานคือมันใช้เวลาร่วมกับ GMT ดังนั้น ....
Craig Hicks

3

การประทับเวลาจะเป็นเวลาเสมอใน utc แต่เมื่อคุณโทรdatetime.datetime.fromtimestamp กลับจะให้เวลาในเขตเวลาท้องถิ่นของคุณตรงกับการประทับเวลานี้ดังนั้นผลลัพธ์ขึ้นอยู่กับสถานที่ของคุณ

>>> import time, datetime

>>> time.time()
1564494136.0434234

>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)

มีไลบรารีที่ดีที่arrowมีพฤติกรรมแตกต่างกัน ในกรณีเดียวกันมันจะคืนค่าวัตถุเวลาของคุณด้วยเขตเวลา UTC

>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.