ฉันจะสร้างวันที่และเวลาใน Python จากมิลลิวินาทีได้อย่างไร


147

ฉันสามารถสร้างวัตถุที่คล้ายกันในวันที่ Java โดยjava.util.Date (มิลลิวินาที) ฉันจะสร้างสิ่งที่เทียบเคียงใน Python ได้อย่างไร

จัดสรรออบเจ็กต์ Date และเริ่มต้นเพื่อแสดงจำนวนมิลลิวินาทีที่ระบุตั้งแต่เวลาพื้นฐานมาตรฐานที่เรียกว่า "ยุค" คือ 1 มกราคม 1970, 00:00:00 GMT

คำตอบ:


229

เพียงแค่แปลงเป็นการประทับเวลา

datetime.datetime.fromtimestamp(ms/1000.0)

17
หมายเหตุ - ใน Python 3 (/) จะทำการหารทศนิยม ในการดำเนินการหารอินทิกรัลให้ใช้ (//)
John Millikin

4
คุณไม่ต้องการการแบ่งลอยหรือไม่? มิฉะนั้นคุณจะสูญเสียความแม่นยำใด ๆ ที่ต่ำกว่า 1 วินาที (ถือไว้ในส่วนเศษส่วนของการประทับเวลา) ดีกว่าที่จะใช้ ms / 1000.0 โดยไม่มีการตัดทอน
Brian

4
datetime รองรับเสมอหรือไม่ หากเรามีความแม่นยำย่อยวินาทีดูเหมือนว่าจะผิดพลาดที่จะทิ้งมันไป ถ้าเราไม่มีก็ไม่มีอันตรายใด ๆ เราก็คงไว้ซึ่งความแม่นยำดั้งเดิมนั้น
Brian

33
เพื่อรักษาความแม่นยำโดยไม่ต้องใช้ลูกลอยคุณสามารถทำได้:datetime.utcfromtimestamp(ms//1000).replace(microsecond=ms%1000*1000)
tsg

2
ปัญหาอื่นในการแก้ปัญหานี้: "fromtimestamp () อาจเพิ่ม ValueError หากการประทับเวลาอยู่นอกช่วงของค่าที่รองรับโดยแพลตฟอร์ม C ฟังก์ชัน localtime () หรือ gmtime () เป็นเรื่องปกติที่จะ จำกัด ไว้ที่ปี 1970 ถึง พ.ศ. 2581” - คาดว่ารหัสของคุณจะอยู่ได้นานแค่ไหน ???
หนูไมค์

12

อะไรประมาณนี้ ฉันคิดว่ามันสามารถนับได้ว่าจะจัดการกับวันที่ก่อนปี 1970 และหลังปี 2038

target_date_time_ms = 200000 # or whatever
base_datetime = datetime.datetime( 1970, 1, 1 )
delta = datetime.timedelta( 0, 0, 0, target_date_time_ms )
target_date = base_datetime + delta

ตามที่กล่าวไว้ใน lib มาตรฐาน Python:

fromtimestamp () อาจเพิ่มค่า ValueError หากการประทับเวลาอยู่นอกช่วงของค่าที่รองรับโดยแพลตฟอร์ม C ฟังก์ชัน localtime () หรือ gmtime () เป็นเรื่องปกติที่สิ่งนี้จะถูก จำกัด ไว้ในปี 1970 ถึง 2038


6
คุณสามารถใช้ได้utc_time = datetime(1970, 1, 1) + timedelta(milliseconds=millis)
jfs

9

หนักไปหน่อยเพราะใช้แพนด้า แต่ใช้งานได้:

import pandas as pd
pd.to_datetime(msec_from_java, unit='ms').to_pydatetime()


0

การแปลงมิลลิวินาทีเป็นวันที่และเวลา (UTC):

import datetime
time_in_millis = 1596542285000
dt = datetime.datetime.fromtimestamp(time_in_millis / 1000.0, tz=datetime.timezone.utc)

การแปลงวันที่และเวลาเป็นสตริงตามมาตรฐานRFC3339 (ใช้โดยข้อกำหนด Open API):

from rfc3339 import rfc3339
converted_to_str = rfc3339(dt, utc=True, use_system_timezone=False)
# 2020-08-04T11:58:05Z
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.