datetime.datetime.utcnow()
Neden bu mu datetimeherhangi saat dilimi bilgisi açıkça bir UTC olduğu göz önüne alındığında değil datetime?
Bunun olmasını beklerdim tzinfo.
datetime.datetime.utcnow()
Neden bu mu datetimeherhangi saat dilimi bilgisi açıkça bir UTC olduğu göz önüne alındığında değil datetime?
Bunun olmasını beklerdim tzinfo.
Yanıtlar:
Bu, saat dilimi naif olduğu anlamına gelir, bu yüzden datetime.astimezone
böyle bir saat dilimi verebilirsin
import pytz # 3rd party: $ pip install pytz
u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset
şimdi zaman dilimlerini değiştirebilirsiniz
print(u.astimezone(pytz.timezone("America/New_York")))
Belirli bir saat diliminde geçerli saati almak için tzinfo'yu datetime.now()doğrudan şu adrese iletebilirsiniz :
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
print(datetime.now(pytz.timezone("America/New_York")))
Gün ışığından yararlanma saatini (DST) gözlemleyenler de dahil olmak üzere herhangi bir saat dilimi için çalışır, yani farklı zamanlarda farklı utc ofsetleri olabilen saat dilimleri için çalışır (sabit olmayan utc ofseti). Kullanmayın tz.localize(datetime.now())- yerel saat belirsiz olduğunda DST sonu geçişi sırasında başarısız olabilir.
astimezone. Bu nedenle datetime sadece yerel zaman dilimlerine sahip olmakla kalmaz, aynı zamanda tzinfo'nun yaygın olarak bulunan tek uygulaması söz konusu standarda uygun değildir.
u=datetime.now(pytz.utc)
tz.localize(datetime.now()); kullanın datetime.now(tz).
Python 3.2'den itibaren datetimemodülün içerdiğini unutmayın datetime.timezone. İçin belgeler datetime.utcnow()diyor:
Mevcut bir UTC tarih saatini arayarak elde edilebilir .
datetime.now(timezone.utc)
Böylece şunları yapabilirsiniz:
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)
datetime.now(timezone.utc)veya datetime.utcnow(timezone.utc)?
datetime.utcnow()hiçbir argüman almaz. Bu yüzden olmalı datetime.now(timezone.utc).
datetime.now()makine saatini datetime.utcnow()döndürür ancak gerçek UTC saatini döndürür.
datetime.utcnow()set gelmez tzinfoo UTC olduğunu belirtmek için. Ancak set iledatetime.now(datetime.timezone.utc) UTC zamanını döndürür . tzinfo
tznesneyi iletirsek , o zaman diliminin zamanını döndürür? Tamam! İşaret ettiğiniz için teşekkürler.
Standart Python kütüphaneleri hiçbir tzinfo sınıfı içermez (ancak bkz. Pep 431 ). Sadece nedenlerini tahmin edebilirim. Şahsen, UTC'ye bir tzinfo sınıfı eklememenin bir hata olduğunu düşünüyorum, çünkü bu standart bir uygulamaya sahip olacak kadar tartışmasız.
Düzenleme: Kütüphanede uygulama olmamasına rağmen, tzinfodokümantasyonda örnek olarak verilen bir uygulama vardır .
from datetime import timedelta, tzinfo
ZERO = timedelta(0)
# A UTC class.
class UTC(tzinfo):
"""UTC"""
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
utc = UTC()
Bunu kullanmak için, geçerli saati bilinçli bir datetime nesnesi olarak almak için:
from datetime import datetime
now = datetime.now(utc)
Orada datetime.timezone.utc3.2+ Python:
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
datetimetarafından yaratılan nesneler için kullanıldığına utcnow()) göre şekil verin ...
timezone.utcnihayet Python 3.2'ye eklendi. Geriye dönük uyumluluk için utcnow()yine de saat dilimi olmayan bir zaman nesnesi döndürür, ancak istediğiniz şeyi elde ederek alabilirsiniz now(timezone.utc).
structmodül Unicode'dan sınamaya otomatik dönüşümler yapacaktı ve nihai karar, kötü bir kararın ilerlemesini önlemek için önceki Python 3 sürümleriyle uyumluluğu kırmaktı.
tzinfobelgelerinin onu uygulamak için kod örnekleri içerdiğinden şaşkına döndüm , ancak datetime'ın kendisinde bu işlevselliği içermiyorlar! docs.python.org/2/library/datetime.html#datetime.tzinfo.fromutc
pytzharika bir kaynak. Örnek kod koymak için cevabımı düzenlediğimde, başka biri bunu önerdi ve gök gürültülerini çalmak istemedim.
pytzModül tek seçenektir ve başka yokturpython-dateutil rağmen üçüncü şahıs paketi de zaten diğer bağımlılıklar ve işletim sistemine bağlı olarak mevcut olabilen.
Ben sadece bu metodolojiyi referans olarak dahil etmek istedim. python-dateutilBaşka amaçlarla kurduysanız tzinfo, çoğaltmak yerinepytz
import datetime
import dateutil.tz
# Get the UTC time with datetime.now:
utcdt = datetime.datetime.now(dateutil.tz.tzutc())
# Get the UTC time with datetime.utcnow:
utcdt = datetime.datetime.utcnow()
utcdt = utcdt.replace(tzinfo=dateutil.tz.tzutc())
# For fun- get the local time
localdt = datetime.datetime.now(dateutil.tz.tzlocal())
Çağrıların utcnowUTC saat dilimi bilgilerini içermesi gerektiğini kabul ediyorum . Yerel datetime kitaplığı, çapraz uyumluluk için datIME varsayılan olarak ayarlandığından bunun dahil olmadığından şüpheleniyorum.
utcdt = datetime.datetime.utcfromtimestamp(1234567890).replace(dateutil.tz.tzutc())
datetime.now(pytz_tz)her zaman çalışır; datetime.now(dateutil.tz.tzlocal())DST geçişleri sırasında başarısız olabilir . PEP 495 - Yerel Saat Belirsizliğidateutil gelecekte durumu iyileştirebilir .
utc_dt = datetime.fromtimestamp(1234567890, dateutil.tz.tzutc())(: not dateutilofset olmayan bir sabit UTC (gibi olan dateutil.tz.tzlocal()burada başarısız olabilir) , kullanmak bir pytzyerine tabanlı bir çözüm ).
dateutiliçin dateutil.parserbu çözümü en çok sevdim. O kadar basit şekilde oluştu: utcCurrentTime = datetime.datetime.now(tz=dateutil.tz.tzutc()). Viyola!!
Julien Danjou neden asla zaman dilimleri ile uğraşmamanız gerektiğini açıklayan iyi bir makale yazdı . Bir alıntı:
Aslında, Python datetime API her zaman habersiz datetime nesneleri döndürür, bu da çok talihsizdir. Gerçekten de, bu nesneden birini alır almaz, saat diliminin ne olduğunu bilmenin bir yolu yoktur, bu nedenle bu nesneler kendi başlarına oldukça "yararsızdır".
Ne yazık ki, kullanabilseniz bile utcnow(), keşfettiğiniz gibi saat dilimi bilgilerini göremezsiniz.
öneriler:
Daima bilinçli
datetimenesneler kullanın , yani saat dilimi bilgisiyle. Bu, onları doğrudan karşılaştırabilmenizi sağlar (farkında ve farkında olmayandatetimenesneler karşılaştırılamaz) ve bunları kullanıcılara doğru bir şekilde döndürür. Kaldıraç pytz saat dilimi nesneleri olması.Giriş ve çıkış dizesi biçimi olarak ISO 8601 kullanın .
datetime.datetime.isoformat()Zaman damgalarını, saat dilimi bilgilerini içeren bu biçim kullanılarak biçimlendirilmiş dize olarak döndürmek için kullanın .ISO 8601 biçimli zaman damgalarını içeren dizeleri ayrıştırmanız gerekirse, güvenebilirsiniz
iso8601, bu da zaman dilimlerini doğru saat dilimi bilgileriyle döndürür. Bu, zaman damgalarını doğrudan karşılaştırılabilir hale getirir.
timezonePython 3.2 ve üzeri sürümlere bilgi eklemek için
import datetime
>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'
AttributeError: 'module' object has no attribute 'timezone' Python 2.7.13 (varsayılan, 19 Oca 2017, 14:48:08)
from datetime import datetime
from dateutil.relativedelta import relativedelta
d = datetime.now()
date = datetime.isoformat(d).split('.')[0]
d_month = datetime.today() + relativedelta(months=1)
next_month = datetime.isoformat(d_month).split('.')[0]
UTC tarihleri, UTC oldukları için herhangi bir saat dilimi bilgisine ihtiyaç duymaz;
pytz.utc). UTC'den farkı bilinmeyen bir değer ile 0 olduğu bilinen bir değer arasında büyük bir fark olduğunu unutmayın. İkincisi, ne döndürmesi utcnow() gerektiğidir , IMO. Bu, dokümantasyon uyarınca "Yorumlamaya açık olmayan belirli bir anı temsil etmek için bilinçli bir nesne kullanılır" ile uyumludur.