วิธีที่ง่ายที่สุดในการรับเวลา GMT ปัจจุบันในรูปแบบการประทับเวลา Unix คืออะไร?


175

งูใหญ่ยังมีแพคเกจที่แตกต่างกัน ( datetime, time, calendar) ที่สามารถมองเห็นที่นี่เพื่อที่จะจัดการกับเวลา ฉันทำผิดพลาดครั้งใหญ่โดยใช้ข้อมูลต่อไปนี้เพื่อรับเวลา GMT ปัจจุบันtime.mktime(datetime.datetime.utcnow().timetuple())

วิธีง่ายๆในการรับเวลา GMT ปัจจุบันในเวลา Unix คืออะไร?


1
อินพุต / เอาต์พุตคืออะไร datetime.utcnow()ส่งกลับเวลา UTC ปัจจุบันเป็นวัตถุ datetime (ฉันถือว่าคุณต้องการ UTC เมื่อคุณกำลังพูดถึง "เวลา GMT") time.time()ส่งคืนการประทับเวลา Unix โดยตรงเป็นจำนวนลอย นี่คือวิธีการแปลง datetime.date/datetime.datetime เวลา UTC ตัวแทนในการประทับเวลา
jfs

วิธีการที่เสนอของคุณผิดหรือแค่ verbose มากเกินไป? ที่เกี่ยวข้อง: stackoverflow.com/questions/15940280/ …
Ciro Santilli 郝海东冠状病病六四事件法轮功

ทำไมวิธีการของคุณผิดพลาด?
skeller88

คำตอบ:


230

ฉันจะใช้ time.time () เพื่อรับการประทับเวลาในไม่กี่วินาทีนับตั้งแต่ยุค

import time

time.time()

เอาท์พุท:

1369550494.884832

สำหรับการติดตั้ง CPython แบบมาตรฐานบนแพลตฟอร์มส่วนใหญ่สิ่งนี้จะส่งคืนค่า UTC


21
สิ่งที่จับได้คือนาฬิกาในเครื่องของคุณอาจไม่ได้อยู่ใน UTC
9000

@ 9000: ถูกต้องแม้ว่าฉันจะยืนยัน UTC ในสภาพแวดล้อมใด ๆ ก็ตาม และเขาขอวิธีที่ง่ายที่สุด โปรดทราบว่าด้วย CPython บนแพลตฟอร์มที่ทันสมัยรวมถึง Linux, BSD, Mac OS X และ Windows จะส่งคืน UTC ทั้งหมดตามเวลา time () สิ่งนี้สะท้อนพฤติกรรมของฟังก์ชันเวลาของไลบรารีมาตรฐาน C ในระบบปฏิบัติการเหล่านี้
Edmond Burnett

66
@ 9000: เขตเวลาท้องถิ่นไม่สำคัญ เวลา Unix สอดคล้องกับเวลา UTC (ถ้าเราไม่สนใจเวลาประมาณวินาทีกระโดด) ลองคิดดูสิ: การประทับเวลาคือจำนวนวินาทีที่ผ่านไปตั้งแต่ยุค (ช่วงเวลาที่แน่นอน): ทำไมมันขึ้นอยู่กับนาฬิกาในเครื่องของเขตเวลาที่ใช้ ในช่วงเวลาใดก็ตามเวลา Unix เหมือนกันทั่วโลก บางแพลตฟอร์ม (ไม่ทราบ) อาจใช้ยุคที่แตกต่างกัน แต่ค่าของมันยังคงไม่ขึ้นอยู่กับเขตเวลาท้องถิ่น
jfs



42

สิ่งนี้ช่วยได้ไหม?

from datetime import datetime
import calendar

d = datetime.utcnow()
unixtime = calendar.timegm(d.utctimetuple())
print unixtime

วิธีการแปลง Python UTC datetime object เป็น UNIX Timestamp


@Cairnarvon นั่นเป็นเพียงตัวอย่าง หากคุณต้องการบันทึกเวลาปัจจุบันคุณสามารถโทรtime.time()และไม่จำเป็นต้องแปลงข้อมูลเป็นวันที่เลยก็ได้
Messa

1
FWIW: นั่นไม่ใช่เวลา UTC มันเป็น UTC แปลงเป็นเวลาท้องถิ่น ในการรับเวลาประทับใน UTC คุณต้องทำอะไรสักอย่าง
Sherlock70

18

หรือเพียงแค่ใช้โมดูลมาตรฐาน datetime

In [2]: from datetime import timezone, datetime
   ...: int(datetime.now(tz=timezone.utc).timestamp() * 1000)
   ...: 
Out[2]: 1514901741720

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

หากคุณต้องการUnix Timestamp (เป็นวินาที) ให้ลบออก* 1000


รหัสของคุณโดยเฉพาะอย่างยิ่งบังคับให้เวลาเป็นจำนวนเต็มดังนั้นฉันสับสนว่าทำไมข้อความที่ส่งออกเป็นจำนวนทศนิยม?
Weston

ท่านที่ไม่ดีของฉันฉันได้เพิ่มการคัดเลือก int ภายหลัง
Maresh

นี่เทียบเท่าของmomentห้องสมุดJavascript moment().utc().valueOf()อย่างแน่นอน สิ่งที่ฉันกำลังมองหา ขอบคุณ
azhar22k

การประทับเวลา UNIX ควรเป็นวินาทีตั้งแต่ปี 1970 โซลูชันของคุณไม่ได้ผลิตสิ่งนี้
พุ่งพรวด

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

18

python2และpython3

มันเป็นการดีที่จะใช้โมดูลเวลา

import time
int(time.time())

1573708436

คุณยังสามารถใช้โมดูล datetime แต่เมื่อคุณใช้ strftime ('% s') แต่ strftime จะแปลงเวลาเป็นเวลาท้องถิ่นของคุณ!

python2

from datetime import datetime
datetime.utcnow().strftime('%s')

python3

from datetime import datetime
datetime.utcnow().timestamp()

2
อยู่ใน UTC + 1, time.time()และdatetime.utcnow().timestamp()จะไม่ให้ค่าเดียวกัน!
user136036

แม้ว่าฉันคาดว่าตัวเลือกที่ 2 จะถูกต้อง แต่ฉันต้องใช้ datetime.now (). timestamp () เพื่อรับค่าที่ถูกต้องใน UTC + 1100 ฉันคาดว่าการประทับเวลา () จะทำงานอย่างถูกต้องทั้ง แต่ดูเหมือนจะไม่
เดวิดวอเตอร์เวิร์ ธ

มองอย่างใกล้ชิดทั้ง datetime.utcnow () และ datetime.now () คืนค่า datetime ไร้เดียงสา (ไม่มี tzinfo) และ timestamp () จะปรากฏขึ้นเพื่อถือว่าเป็นโลคัลเมื่อ tzinfo = null
เดวิดวอเตอร์เวิร์ ธ

2

ฉันชอบวิธีนี้:

import datetime, time

dts = datetime.datetime.utcnow()
epochtime = round(time.mktime(dts.timetuple()) + dts.microsecond/1e6)

วิธีการอื่นที่โพสต์ที่นี่ไม่รับประกันว่าจะให้ UTC กับทุกแพลตฟอร์มหรือรายงานเฉพาะวินาทีทั้งหมด หากคุณต้องการความละเอียดเต็มรูปแบบจะใช้งานได้กับไมโครวินาที


1
น่าเสียดายที่นี่ไม่ได้ให้ UTC เว้นแต่คุณจะอยู่ในเขตเวลา UTC + 0000 ใช้utctimetupleแทนจะหลอกลวงว่า
ท้องฟ้า

1
from datetime import datetime as dt
dt.utcnow().strftime("%s")

เอาท์พุท:

1544524990

สิ่งนี้ไม่ส่งกลับเช่นเดียวกับtime.time()ฉัน
Alwinius

1
อาจเป็นเพราะdt.utcnowส่งคืนข้อมูลที่datetimeไม่มีเขตเวลา จากนั้นstrftimeสมมติว่าdatetimeเป็นเวลาท้องถิ่น
Skyking

1
@skyking นี่เป็นปัญหาสำหรับคำตอบเกือบทั้งหมดในหน้านี้!
เดวิดวอเตอร์เวิร์ ธ

1
#First Example:
from datetime import datetime, timezone    
timstamp1 =int(datetime.now(tz=timezone.utc).timestamp() * 1000)
print(timstamp1)

เอาต์พุต: 1572878043380

#second example:
import time
timstamp2 =int(time.time())
print(timstamp2)

เอาท์พุต: 1572878043

  • ที่นี่เราสามารถดูตัวอย่างแรกให้เวลาที่แม่นยำกว่าครั้งที่สอง
  • ที่นี่ฉันกำลังใช้อันแรก

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