Python'da milisaniyeden nasıl datetime oluşturabilirim?


143

Java'da java.util.Date (milisaniye) ile benzer bir Date nesnesi oluşturabilirim . Python'da benzerini nasıl oluştururum?

Bir Date nesnesi tahsis eder ve onu 1 Ocak 1970 00:00:00 GMT olarak bilinen "epoch" olarak bilinen standart temel zamandan beri belirtilen milisaniye sayısını temsil edecek şekilde başlatır.

Yanıtlar:


216

Sadece zaman damgasına dönüştür

datetime.datetime.fromtimestamp(ms/1000.0)

17
Bir not - Python 3'te, (/) kayan nokta bölmesini gerçekleştirecektir. İntegral bölme yapmak için (//) kullanın.
John Millikin

3
Yine de kayan bölme istemiyor musun? Aksi takdirde, 1 saniyenin altındaki herhangi bir hassasiyeti kaybedersiniz (zaman damgasının kesirli kısmında tutulur). Kesinti olmadan ms / 1000.0 kullanmak daha iyidir.
Brian

4
Kesinlikle datetime her zaman destekler mi? Saniyenin altında bir hassasiyetimiz varsa, onu atmak yanlış görünüyor. Bir zararı olmazsa - sadece bu orijinal hassasiyeti koruyoruz.
Brian

30
Hassasiyeti kayan nokta kullanmadan korumak için şunları da yapabilirsiniz:datetime.utcfromtimestamp(ms//1000).replace(microsecond=ms%1000*1000)
tsg

2
bu çözümle ilgili başka bir sorun: "fromtimestamp (), zaman damgası platform C localtime () veya gmtime () işlevleri tarafından desteklenen değer aralığının dışındaysa ValueError'ı yükseltebilir. Bunun 1970'den yıllara kadar sınırlı olması yaygındır. 2038" - kodunuzun ne kadar sürmesi bekleniyor ???
mike rodent

12

Peki buna ne dersin? 1970 öncesi ve 2038 sonrası tarihlerin işleyeceğine güvenilebileceğini tahmin ediyorum.

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

Python standart kitaplığında belirtildiği gibi:

fromtimestamp (), zaman damgası platform C localtime () veya gmtime () işlevleri tarafından desteklenen değer aralığının dışındaysa ValueError'ı yükseltebilir. Bunun 1970'den 2038'e kadar yıllarla sınırlandırılması yaygındır.


6
kullanabilirsinizutc_time = datetime(1970, 1, 1) + timedelta(milliseconds=millis)
jfs

9

Pandalar kullanıldığı için biraz ağır ama işe yarıyor:

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

2
import pandas as pd

Date_Time = pd.to_datetime(df.NameOfColumn, unit='ms')

0

Milis değerini tarih saatine (UTC) dönüştürme:

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

RFC3339 standardına göre tarih saatini dizeye dönüştürme (Open API spesifikasyonu tarafından kullanılır):

from rfc3339 import rfc3339
converted_to_str = rfc3339(dt, utc=True, use_system_timezone=False)
# 2020-08-04T11:58:05Z
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.