รับเวลาปัจจุบันเป็นมิลลิวินาทีใน Python หรือไม่


532

ฉันจะรับเวลาปัจจุบันเป็นมิลลิวินาทีใน Python ได้อย่างไร


67
import time; ms = time.time()*1000.0
samplebias

4
@samplebias: time.time()อาจให้ความแม่นยำที่ต่ำกว่าdatetime.utcnow()ในบางแพลตฟอร์มและรุ่นหลาม
jfs

5
ในหน่วยมิลลิวินาทีตั้งแต่เมื่อใด หากคุณหมายถึงตั้งแต่ยุค (เที่ยงคืน 1 มกราคม 1970 UTC) ดูสิ่งนี้: stackoverflow.com/questions/18169099//
Michael Scheper

2
สำหรับการประทับเวลาแบบไมโครวินาทีความละเอียดจริงดูที่นี่: stackoverflow.com/questions/38319606/…
Gabriel Staples

คำตอบ:


710

สำหรับสิ่งที่ฉันต้องการนี่คือสิ่งที่ฉันทำตามความคิดเห็นของ @samplebias ด้านบน:

import time
millis = int(round(time.time() * 1000))
print millis

Quick'n'easy ขอบคุณทุกคนขอโทษสำหรับผายลมในสมอง

สำหรับการใช้ซ้ำ:

import time

current_milli_time = lambda: int(round(time.time() * 1000))

แล้ว:

>>> current_milli_time()
1378761833768

34
นี่อาจไม่ได้คำตอบที่ถูกต้อง ตามเอกสาร "หมายเหตุว่าถึงแม้เวลาจะกลับมาเสมอเป็นจำนวนจุดลอย, ระบบทั้งหมดไม่ให้เวลาที่มีความแม่นยำที่ดีขึ้นกว่า 1 วินาที"
เจสัน Polites

11
ผมสงสัยว่าทำไมคุณต้องround? ดูเหมือนint(time.time() * 1000)จะเพียงพอหรือไม่
Maxim Vladimirsky

14
IMO ฉันใช้พื้นและไม่ปัด แต่นั่นเป็นเพียงฉัน หากมีคนถามว่าชั่วโมงคืออะไรและเป็น 7:32 จำนวนที่พวกเขาอาจต้องการคือ 7 ไม่ใช่ 8
davr

1
@ParallelUniverse: .utcnow()ใช้GetSystemTimeAsFileTime()ใน CPython ล่าสุดบน Windows จะไม่time.clock()โทร ( QueryPerformanceCounter()) แนะนำเสียงรบกวนมากกว่าที่จะลดหรือไม่ ดูความแม่นยำไม่ได้เป็นเช่นเดียวกับความถูกต้อง
jfs

10
@MaximVladimirsky นั่นไม่ใช่พฤติกรรมของ int () Int ไม่ได้ใส่ค่าลงไป แต่จะปัดไปทางศูนย์ ซึ่งเป็นจำนวนเดียวกันสำหรับจำนวนบวก แต่ตรงกันข้ามกับจำนวนลบ int (1.5) ให้ 1, int (-1.5) ให้ -1, math.floor (-1.5) ให้ -2 ดู: docs.python.org/2/library/stdtypes.html
ข้าม Huffman

91

time.time()เพียง datetimeแต่อาจจะให้ความละเอียดที่สองวิธีที่แนะนำสำหรับมิลลิวินาทีคือ

from datetime import datetime
dt = datetime.now()
dt.microsecond

94
ไม่ค่อยมีประโยชน์ - เพียงแค่ให้ microseconds ภายใน dt วินาที ดูstackoverflow.com/a/1905423/74632
Boris Chervenkov

8
+1 เนื่องจากเป็นวิธีที่เป็นทางการในการรับเวลาบันทึกที่เชื่อถือได้จากระบบ
Pascal

16
-1 นี่เป็นคำตอบที่ไม่ถูกต้องสำหรับคำถามนี้ ตามที่ @ Boris แสดงความคิดเห็นสิ่งนี้จะไม่ให้ "เวลาเป็นไมโครวินาที" เช่นไม่รวมวัน, ชั่วโมง, วินาทีในจำนวนไมโครวินาที
ja

3
+1 สิ่งนี้ให้ค่าที่ถูกต้องและสามารถใช้คณิตศาสตร์ได้เพราะคณิตศาสตร์ หากผู้ใช้ต้องการเวลาปัจจุบันเป็นมิลลิวินาที / ไมโครวินาทีเลขคณิตอย่างง่ายจะนำมาให้ หากจำเป็นต้องใช้เวลาเดลต้า - ซึ่งไม่ได้ขอ - เลขคณิตอีกครั้งจะบันทึกวัน
Jack Stout

3
ให้ไมโครวินาทีของเวลาปัจจุบันไม่ใช่เวลาประทับทั้งหมด
kawadhiya21

48
def TimestampMillisec64():
    return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000) 

3
คุณสามารถ inline สูตรสำหรับ.total_seconds()การผลิต (อาจจะ) มีความแม่นยำที่ดีกว่า: (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3(มีส่วนจริงเปิดใช้งาน)// 10**3หรือถ้าคุณต้องการที่จะตัดทอนมิลลิวินาทีแล้วใช้
jfs

1
นี่น่าจะเป็นคำตอบที่ดีที่สุดถ้าใช้ datetime
dlsso

35

จากรุ่น 3.7คุณสามารถใช้time.time_ns()เพื่อรับเวลาเป็นวินาทีที่ผ่านมาจากยุคสมัย ดังนั้นคุณสามารถทำได้

ms = time.time_ns() // 1000000 

เพื่อรับเวลาเป็น mili-seconds


สิ่งนี้ใช้ได้ผลดีที่สุดสำหรับฉัน (Python 3.7.6)
Paul Watson


13

อีกวิธีคือฟังก์ชั่นที่คุณสามารถฝังลงใน utils.py ของคุณเอง

import time as time_ #make sure we don't override time
def millis():
    return int(round(time_.time() * 1000))

12

หากคุณต้องการวิธีการง่ายๆในรหัสของคุณที่ส่งกลับมิลลิวินาทีด้วยวันที่และเวลา:

from datetime import datetime
from datetime import timedelta

start_time = datetime.now()

# returns the elapsed milliseconds since the start of the program
def millis():
   dt = datetime.now() - start_time
   ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
   return ms

นี่คือความแตกต่างระหว่างสองครั้งในหน่วยมิลลิวินาทีการรวมวิธีการของคุณกับ @Jason s ให้เวลาปัจจุบันในหน่วยมิลลิวินาที ... คิดเกี่ยวกับมันการประทับเวลา UNIX จะเป็นวิธีการของคุณด้วยstart_time= datetime (1970,1,1)
PR

เวลาท้องถิ่นอาจไม่ชัดเจนและไม่ซ้ำซากจำเจ (เนื่องจากการเปลี่ยน DST หรือเหตุผลอื่นเพื่อเปลี่ยนอ็อฟเซ็ต utc ท้องถิ่น) ใช้แทนหรือถ้าคุณไม่จำเป็นต้องในเวลาที่แน่นอนแล้วคุณสามารถใช้.utcnow() time.monotonous()หมายเหตุ: มีความแตกต่างเล็กน้อยเนื่องจากการคำนวณเลขทศนิยมระหว่างsome_int + dt.microseconds/ 1000.0และสูตร( ) / 10**3ที่เปิดใช้งานการหารจริง ดูสูตรที่ชัดเจนและลิงก์สำหรับtotal_seconds()คำตอบที่เกี่ยวข้อง
jfs

7

วิธีที่ง่ายที่สุดที่ฉันพบเพื่อให้ได้เวลา UTC ปัจจุบันในหน่วยมิลลิวินาทีคือ:

# timeutil.py
import datetime


def get_epochtime_ms():
    return round(datetime.datetime.utcnow().timestamp() * 1000)

# sample.py
import timeutil


timeutil.get_epochtime_ms()

7

หากคุณกำลังกังวลเกี่ยวกับการวัดระยะเวลาที่ผ่านไปคุณควรใช้นาฬิกาเนื่อง (หลาม 3) นาฬิกานี้ไม่ได้รับผลกระทบจากการอัพเดตนาฬิการะบบเช่นคุณจะเห็นว่าแบบสอบถาม NTP ปรับเวลาระบบของคุณหรือไม่

>>> import time
>>> millis = round(time.monotonic() * 1000)

ให้เวลาอ้างอิงเป็นวินาทีที่สามารถใช้เปรียบเทียบในภายหลังเพื่อวัดเวลาที่ผ่านไป


4

หากคุณใช้รหัสของฉัน (ด้านล่าง) เวลาจะปรากฏขึ้นในไม่กี่วินาทีจากนั้นหลังจากทศนิยมเป็นมิลลิวินาที ฉันคิดว่ามีความแตกต่างระหว่าง Windows และ Unix - โปรดแสดงความคิดเห็นหากมี

from time import time

x = time()
print(x)

ผลลัพธ์ของฉัน (บน Windows) คือ:

1576095264.2682993

แก้ไข : ไม่มีความแตกต่าง :) ขอบคุณ tc0nn


1
ไม่ต่างกับ Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn

1
ไม่ต่างกับ Ubuntu 18:python3 scratch.py 1577212763.9136133
tc0nn

1

การคูณเหล่านี้เป็น 1,000 เป็นมิลลิวินาทีอาจเหมาะสมสำหรับการแก้ปัญหาหรือทำให้มีข้อกำหนดเบื้องต้นบางอย่างที่ยอมรับได้ อาจใช้เพื่อเติมช่องว่างในฐานข้อมูลของคุณซึ่งไม่ได้ใช้จริง ๆ แม้ว่าสำหรับสถานการณ์จริงที่ต้องใช้เวลาที่แม่นยำในที่สุดมันก็จะล้มเหลว ฉันจะไม่แนะนำให้ใครใช้วิธีนี้สำหรับการปฏิบัติภารกิจที่สำคัญซึ่งต้องการการดำเนินการหรือการประมวลผลตามเวลาที่กำหนด

ตัวอย่างเช่น: การส่ง Ping ไปกลับเป็นเวลา 30-80ms ในสหรัฐอเมริกา ... คุณไม่สามารถปัดมันและใช้มันอย่างมีประสิทธิภาพ

ตัวอย่างของฉันเองต้องการงานทุกวินาทีซึ่งหมายความว่าถ้าฉันปัดเศษขึ้นหลังจากงานแรกที่ตอบกลับฉันจะยังคงต้องใช้เวลาในการประมวลผลคูณทุกรอบวนรอบหลัก สิ่งนี้กลายเป็นการเรียกใช้ฟังก์ชันทั้งหมดในทุก ๆ 60 วินาที นั่นคือ ~ 1440 ต่อวัน .. ไม่แม่นยำเกินไป

แค่ความคิดสำหรับคนที่กำลังมองหาเหตุผลที่แม่นยำมากกว่าการแก้ช่องว่างฐานข้อมูลที่ไม่ได้ใช้จริง ๆ


2
คุณมีทางออกที่ดีกว่าไหม? ฉันก็ไม่เข้าใจในสิ่งที่คุณพูด คุณหมายถึงอะไร "round up"?
คืน

2
อธิบายวิธีแก้ปัญหาของคุณด้วยตัวอย่างที่ใช้งานได้จริงเพื่อความเข้าใจที่ดีขึ้น
Ratan Uday Kumar

0

อีกโซลูชันที่ใช้datetimeโมดูลสำหรับ Python 3

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