Python'da UTC saati nasıl alınır?


112

StackExchange'de bir çözüm aradım ama hiçbir şey ihtiyacım olanı yapmıyor. JavaScript'te, 1 Ocak 1970'den beri UTC saatini hesaplamak için aşağıdakileri kullanıyorum:

function UtcNow() {
    var now = new Date();
    var utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    return utc;
}

Eşdeğer Python kodu nedir?



Bekle, Python mu yoksa JavaScript mi ​​kullanıyorsun?
CheetSheatOverlode

Yanıtlar:


179

Datetime.utcnow () kullanan bu kodu deneyin :

from datetime import datetime
datetime.utcnow()

Amaçlarınız için, iki tarih arasında harcanan süreyi hesaplamanız gerektiğinde, ihtiyacınız olan tek şey bitiş ve başlangıç ​​tarihlerini çıkarmaktır. Böyle bir çıkarmanın sonuçları bir timedelta nesnesidir.

Python belgelerinden:

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

Ve bu, varsayılan olarak, tanımında belirtilen alanlardan herhangi birini alabileceğiniz anlamına gelir - günler, saniye, mikrosaniye, milisaniye, dakika, saat, hafta. Ayrıca timedelta örneğinde total_seconds () yöntemi vardır:

Süre içinde bulunan toplam saniye sayısını döndür. Gerçek bölme etkinken hesaplanan (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 * 6) / 10 * 6'ya eşdeğerdir .


2
datetime.utcnow () ile ilgili muhtemelen kötü bir sürpriz, isme rağmen saat dilimini tanıyan bir nesne döndürmemesidir. Bu bence büyük bir problem, bu yüzden aşağıdaki cevabımı tercih ediyorum. Bkz. "Saat dilimi olmayan datetime nesneleri uygulamada bir" hata "olarak değerlendirilmelidir." julien.danjou.info/python-and-timezones
Tim Richardson

1
Naif datetime nesnesi olarak adlandırılan kavram (yani, zaman dilimi bilgisi ayarlanmamıştır) bir amaca hizmet eder: Dünyanın neresinde olursam olayım her gün 06: 00'da çalar saatimin çalmasını istiyorum. Ayrıca bilgisayar oyunlarında "sanal saatlere" izin veriyor: Benim fantezi dünyamda saat 17:00. Bir saat dilimini datetime nesnesine zorlamak, özellikle timedelta aritmetiği söz konusu olduğunda garip olur.
DustByte

42

Orijinalinize en yakın biçimde:

import datetime

def UtcNow():
    now = datetime.datetime.utcnow()
    return now

Yerel bir Python yerine 1970-01-01 arasındaki saniye sayısını bilmeniz gerekiyorsa datetime, bunun yerine şunu kullanın:

return (now - datetime.datetime(1970, 1, 1)).total_seconds()

Python, Javascript'te alışkın olabileceğinizle çelişen adlandırma kurallarına sahiptir, bkz. PEP 8 . Ayrıca, başka bir işlevin sonucunu basitçe döndüren bir işlev oldukça saçmadır; sadece onu daha erişilebilir kılmak söz konusuysa, bir işlev için basitçe atayarak başka bir ad oluşturabilirsiniz. Yukarıdaki ilk örnek şu şekilde değiştirilebilir:

utc_now = datetime.datetime.utcnow

1
Cevabınızı yukarıdan daha yüksek puan alan cevaptan daha çok beğendim. Buradaki derinlik için teşekkür ederim.
Jordan Dea-Mattson

@Jordan, cevabıma geri dönüp baktığımda, içe aktarmayı küresel düzeyden ziyade işlevin içine yerleştirerek biçimsel bir hata yaptığımı fark ettim, şimdi bunu düzelteceğim.
Mark Ransom

8
Belki de UtcNow () işlevini başka bir işleve kaydırmayı düşünmelisiniz. Bu çok basit. Ayrıca alt çizgi kullanmamaya devam edin. PEP 8 çok sıkıcı ...
vcarel

1
Basit bir tek
satırlık

1
@TimRichardson Katılmıyorum, ancak bu cevabın yazıldığı sırada başka bir alternatif yoktu - Python tzinfo, UTC için bile herhangi bir nesne içermiyordu .
Mark Ransom

32

Yalnızca modern python için basit, standart kitaplık. Aksine, saat dilimine duyarlı tarih saati verir datetime.utcnow(). datetimessaat dilimleri olmadan gerçekleşmeyi bekleyen kazalardır.

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)

5
Python 3 belgelerine göre bunu yapmanın önerilen yolu budur.
roskakori

Temiz ve kolay! Tercih edilen yol olmalı.
Marry35

21
import datetime
import pytz

# datetime object with timezone awareness:
datetime.datetime.now(tz=pytz.utc)

# seconds from epoch:
datetime.datetime.now(tz=pytz.utc).timestamp() 

# ms from epoch:
int(datetime.datetime.now(tz=pytz.utc).timestamp() * 1000) 

10

Datetime.datetime öğesinden strftime yöntemiyle zaman damgalarına zaten dışa aktarabilirsiniz. İşlev örneğinizin ardından:

import datetime
def UtcNow():
    now = datetime.datetime.utcnow()
    return int(now.strftime("%s"))

Mikrosaniye istiyorsanız, dışa aktarma dizesini değiştirmeniz ve şunun gibi kayması için çevirmeniz gerekir: return float(now.strftime("%s.%f"))


Sayıyı doğrudan alabildiğinizde bir dizgeye ve sonra tekrar sayıya dönüştürmenin anlamı nedir?
Mark Ransom

Önemli olan nokta şu ki, fonksiyondaki şeyleri değiştirmek isteyebilirsiniz ve bu nedenle datetime nesnesini kullanmamak daha iyidir time.time(), ayrıca doğrudan int'e dönüştürmek için time.mktime (now.timetuple ()) kullanabilirsiniz. Her neyse, bu basit durum time.time()için de geçerli bir seçenektir. Garip bulduğum şey, saniyeleri bulmak için timedelta'ya gitmek.
hectorcanto

Unutmayın, bu strftime("%s")platforma bağlıdır ve Windows'ta çalışmaz. (En azından Windows 10'da benim için değil).
Julian Kirsch

8

Sıfır dış bağımlılıkla saat dilimi farkında:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)

-4

Python 3'te lambda ifadesini kullanarak deneyin;

from datetime import datetime
utc_now = lambda : datetime.utcnow()

ve işlevi normal olarak çağırın;

print(utc_now())

2
şimdi iyi olun çocuklar; ^)
Demis
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.