time
Modülü
time
modülü geçen süreyi bize “saniyeler cinsinden” söyleyen fonksiyonlar sağlar.
import time
Unix Dönem Zamanı
Veritabanına kayıt yapıyorsanız ve zaman damgası ile ilgileniyorsanız kullanmak isteyeceğiniz biçim bu. Tamsayıya dönüştürülebilen basit bir float döndürür. 1 Ocak 1970, 00:00:00’dan bu yana geçen zamanı saniye cinsinden gösterdiği için saniyeler cinsinden aritmetik işlemler için de kullanışlıdır. Az sonra göreceğimiz fonksiyonlara göre de bellek açısından hafiftir:
>>> time.time()
1424233311.771502
Bu yöntem artık-saniyeleri hesaba katmaz, bu nedenle pek doğru değildir. Her ne kadar uluslararası UTC standardına uymasa da, yine de oldukça yakındır ve bu nedenle çoğu kayıt tutma işlemi için kullanışlı olabilir.
Ancak bu yöntem gelecek planlamaları için ideal değildir. Gelecekte belirli bir zamanda gerçekleşmesini istediğiniz bir olay varsa, bu zamanı bir nesnede veya bir dizede depolamak istersiniz. (bunlara az sonra bakacağız)
time.ctime
Şimdiki zamanı işletim sisteminiz tarafından tercih edilen şekilde de gösterebilirsiniz (bu yöntem, sistem tercihlerinizi değiştirdiğinizde gösterimin değişebileceği anlamına gelir, bu nedenle yazacağınız kodun tüm sistemlerde standart olması için buna güvenmeyin). Bu genellikle kullanıcı dostudur, ancak genellikle kronolojik olarak sıralanabilir dizeler oluşturmaz:
>>> time.ctime()
'Tue Feb 17 23:21:56 2015'
Zaman damgalarını da okunabilir forma dönüştürebilirsiniz
>>> time.ctime(1424233311.771502)
'Tue Feb 17 23:21:51 2015'
Bu dönüşüm de kayıt tutmak için iyi değildir (yalnızca insanlar tarafından ayrıştırılacak metinlerde belki kullanılabilir).
datetime
modülü
datetime
modülü oldukça yararlıdır:
>>> import datetime
datetime.datetime.now
geçerli saati döndüren bir fonksiyondur. Saat dilimi bilgisi olmadan kullanılır. Kabukta yankılanan bir gösterime sahiptir, ancak yazdırıldığında (veya bir nesneye zorlandığında), insan tarafından okunabilir biçimdedir ve sözcükbilimsel sıralama kronolojik sıralamaya eşdeğerdir:
>>> datetime.datetime.now()
datetime.datetime(2015, 2, 17, 23, 43, 49, 94252)
>>> print(datetime.datetime.now())
2015-02-17 23:43:51.782461
datetime utcnow
Genel bir standart olan UTC saatinde bir datetime nesnesi alabilirsiniz:
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 2, 18, 4, 53, 28, 394163)
>>> print(datetime.datetime.utcnow())
2015-02-18 04:53:31.783988
UTC, GMT saat dilimine neredeyse eşdeğer bir zaman standardıdır. (GMT ve UTC Yaz Saati için değişmese de, kullanıcıları Yaz aylarında İngiliz Yaz Saati gibi diğer saat dilimlerine geçebilir.)
datetime ve saat dilimi
Ancak, şimdiye kadar oluşturduğumuz datetime nesnelerinin hiçbiri kolayca çeşitli saat dilimlerine dönüştürülemez. Bu sorunu pytz
modülü ile çözebiliriz:
>>> import pytz
>>> then = datetime.datetime.now(pytz.utc)
>>> then
datetime.datetime(2015, 2, 18, 4, 55, 58, 753949, tzinfo=<UTC>)
Eşdeğer olarak, Python 3’te, nesne zaman dilimini de göz önünde tutan bir utc örneği ekli sınıfa sahibiz
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2015, 2, 18, 22, 31, 56, 564191, tzinfo=datetime.timezone.utc)
Ve orijinal UTC nesnesinden zaman dilimlerine kolayca dönüşebileceğimizi görüyoruz.
>>> print(then)
2015-02-18 04:55:58.753949+00:00
>>> print(then.astimezone(pytz.timezone('US/Eastern')))
2015-02-17 23:55:58.753949-05:00
Ayrıca, bir datetime nesnesini timezone yöntemiyle veya tzinfo özniteliğini değiştirerek de yapabilirsiniz. Ancak bunlar son çarelerdir:
>>> pytz.utc.localize(datetime.datetime.utcnow())
datetime.datetime(2015, 2, 18, 6, 6, 29, 32285, tzinfo=<UTC>)
>>> datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
datetime.datetime(2015, 2, 18, 6, 9, 30, 728550, tzinfo=<UTC>)
pytz
modülü, nesnelerimizin timezone’a farkında hale getirmemize ve zamanları modülde bulunan yüzlerce saat dilimine dönüştürmemizi sağlar.
Bu nesneyi UTC zamanı için görünür bir şekilde seri hale getirebiliriz ve bunu bir veritabanında saklayabiliriz. Ancak bu yöntem görece daha fazla bellek gerektirir. Ayrıca ilk olarak gösterdiğimiz Unix Epoch zamanını depolamaktan çok daha fazla hataya eğilimli olur.
Diğer görüntüleme yolları, özellikle farklı saat dilimlerinden gelebilecek verilerle uğraşırken çok daha hataya eğilimlidir. Bir dizenin veya seri hale getirilmiş datetime nesnesinin hangi saat dilimi için tasarlandığı konusunda bir karışıklık olmasını istemezsiniz.