Python Programlama Dili

datetime Modülü

Python’da datetime adlı bir modül bulunur. Bu modül bize tarih ve zamanla ilgili işlemleri gerçekleştirme imkanı sağlar. Bu modül Python’un standart kütüphanesine dahil olduğundan, yani Python geliştiricilerince yazıldığından, bu modülü kullanmak için herhangi bir harici program kurmamıza gerek yok. Yazdığımız bir programda datetime modülüne ihtiyaç duyarsak, modülü normal bir şekilde içe aktarmamız yeterli olacaktır:

>>> import datetime

Dilerseniz ilk iş olarak bu modülün içeriğinde neler olup olmadığına bir bakalım:

>>> dir(datetime)

['MAXYEAR', 'MINYEAR', '__doc__', '__name__', '__package__',
'date', 'datetime', 'datetime_CAPI', 'time', 'timedelta', 'tzinfo']

Biz bu derste, yukarıda görünen nitelik ve fonksiyonları isimlerine göre değil, işlevlerine göre inceleyeceğiz.

Bugünün Tarihini Bulmak

datetime adlı modülü kullanarak bugünün tarihini bulabiliriz. Bunun için şöyle bir kod yazıyoruz:

>>> bugun = datetime.date.today()

Burada, datetime modülünün date adlı sınıfı içinde yer alan today() adlı bir fonksiyonu çağırdık. Bu fonksiyon bize bugünün tarihini verir:

>>> print bugun

2010-07-08

Bu çıktıda görünen tarih “yıl-ay-gün” şeklindedir. Yani yukarıdaki karakter dizisi 8 Temmuz 2010 tarihini gösteriyor.

Yukarıdaki kodu kullanarak, yıl, ay ve gün bilgilerini tek tek ayıklayabilirsiniz:

>>> print "%s yılındayız!" %bugun.year

2010 yılındayız!

>>> print "%s yılının %s. ayındayız!" %(bugun.year, bugun.month)

2010 yılının 7. ayındayız!

>>> print "%s. ayın %s. günündeyiz!" %(bugun.month, bugun.day)

7. ayın 8. günündeyiz!

Gördüğünüz gibi bugun.year yılı, bugun.month ayı, bugun.day ise günü gösteriyor.

Bir Tarihin Hangi Güne Geldiğini Bulmak

Bir önceki bölümde datetime modülünü kullanarak bugünün tarihiyle ilgili bazı bilgiler edinebildik. Bu bölümde ise bir tarihin haftanın hangi gününe denk geldiğini bulmaya çalışacağız. Şimdi şu kodlara dikkatlice bakalım:

>>> bugun = datetime.date.today()

Böylece bugünün tarihin aldık. Şimdi bu tarihin hangi güne denk geldiğini bulacağız:

>>> print bugun.weekday()

3

Muhtemelen çıktının bu şekilde olmasını beklemiyordunuz. Python haftanın günlerini gösterirken sayılardan yararlanır. Buna göre şöyle bir tablo çizebiliriz:

Sayı Gün
0 Pazartesi
1 Salı
2 Çarşamba
3 Perşembe
4 Cuma
5 Cumartesi
6 Pazar

Buna göre yukarıdaki çıktıda gördüğümüz 3 sayısı Perşembe gününe işaret ediyor. Eğer Python’ın günleri sayıyla göstermesi hoşunuza gitmediyse, sözlüklerden yararlanarak şöyle bir şey yazabilirsiniz:

#!/usr/bin/env python
#-*- coding: utf-8

import datetime

hafta = {0: "Pazartesi",
         1: "Salı",
         2: "Çarşamba",
         3: "Perşembe",
         4: "Cuma",
         5: "Cumartesi",
         6: "Pazar"}

bugun = datetime.date.today()

print "Bugün %s" %(hafta[bugun.weekday()])

Yukarıda yaptığımız işlemler hep bugünün tarihi ile ilgiliydi. Ancak tabii istersek farklı tarihler üzerinde de işlem yapabiliriz. Bunun için öncelikle üzerinde işlem yapacağımız tarihi belirtmemiz gerekiyor. Bunu şu şekilde yapıyoruz:

>>> tarih = datetime.date(2010, 5, 30)

Burada, 30 Mayıs 2010 tarihini belirttik. Bunu nasıl yaptığımıza çok dikkat edin. datetime.date adlı sınıfı kullanarak, ilgili tarihi yıl-ay-gün şeklinde parantez içinde yazıyoruz. Böylece şu çıktıyı elde edebiliyoruz:

>>> print tarih

2010-05-30

Mesela bu tarihin hangi güne denk geldiğini bulmak istersek weekday() adlı fonksiyondan yararlanabileceğimizi biliyorsunuz:

>>> print tarih.weekday()

6

Demek ki 30 Mayıs 2010 tarihi Pazar gününe denk geliyormuş... Tabii isterseniz yukarıda yazdığımız sözlükten yararlanarak daha net bir çıktı alabilirsiniz:

#!/usr/bin/env python
#-*- coding: utf-8

import datetime

hafta = {0: "Pazartesi",
         1: "Salı",
         2: "Çarşamba",
         3: "Perşembe",
         4: "Cuma",
         5: "Cumartesi",
         6: "Pazar"}

tarih = datetime.date(2010, 5, 30)

print ("%s tarihi %s gününe denk gelir"
%(tarih, hafta[tarih.weekday()]))

Daha önce öğrendiğimiz month, day ve year nitelikleri burada da geçerlidir:

>>> print tarih.month #ay

5

>>> print tarih.day #gün

30

>>> print tarih.year #yıl

2010

Tarihleri Biçimlendirmek

Yukarıda öğrendiğimiz bilgilere göre bugünün tarihini elde edebilmek için şöyle bir kod yazabiliyoruz:

>>> bugun = datetime.date.today()

Bu kod bize bugünün tarihinin ne olduğunu gösterir:

>>> print bugun

2010-07-08

Ancak bu çıktı bir karakter dizisi olmadığı için, bu çıktıyı istediğimiz gibi biçimlendirmek mümkün değildir. Yani mesela şöyle bir şey yazamayız:

>>> print bugun[:4]

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'datetime.date' object is unsubscriptable

Dediğimiz gibi, yukarıdaki çıktı bir karakter dizisi değildir. İsterseniz bu durumu hemen teyit edelim:

>>> type(bugun)

<type 'datetime.date'>

Gördüğünüz gibi elimizdeki şey bir “datetime.date” nesnesi... Eğer biz tarih çıktılarını karakter dizisi olarak almak istersek strftime() adlı özel bir fonksiyondan yararlanabiliriz. Bunu şöyle kullanıyoruz:

>>> bugun = datetime.date.today()

>>> print bugun.strftime("%c")

08.07.2010 00:00:00

strftime() fonksiyonu son derece yararlı bir araçtır. Bu aracı kullanarak tarih bilgilerini istediğimiz şekilde biçimlendirebiliriz. Bu işi yaparken bir takım işaretlerden/karakterlerden yararlanmamız gerekiyor. Biz yukarıdaki örnekte “%c” adlı karakteri kullandık. Dilerseniz bu karakterlerin en önemlilerini listeleyelim:

Karakter Anlamı
%a hafta gününün kısaltılmış adı
%A hafta gününün tam adı
%b ayın kısaltılmış adı
%B ayın tam adı
%c tam tarih
%d tamsayı cinsinden gün
%j belli bir tarihin, yılın kaçıncı gününe denk geldiğini gösteren 1-366 arası bir sayı
%m tamsayı cinsinden ay
%U belli bir tarihin yılın kaçıncı haftasına geldiğini gösteren 0-53 arası bir sayı
%y yılın son iki rakamı
%Y tamsayı cinsinden yıl

İsterseniz bu tabloya bakarak birkaç örnek de verelim:

>>> print "Bugün günlerden %s" %bugun.strftime("%A")

Bugün günlerden Perşembe

>>> print bugun.strftime("%a")

Per

Dilerseniz bütün karakter dizisini doğrudan strftime() fonksiyonu içine de yazabilirsiniz:

>>> print bugun.strftime("Aylardan %B")

Aylardan Temmuz

Dediğimiz gibi, strftime() fonksiyonunun dönüş değeri bir karakter dizisidir. Dolayısıyla bu karakter dizisini istediğiniz gibi biçimlendirebilirsiniz:

>>> tarih = datetime.date(2005, 4, 3)

>>> krk = tarih.strftime("%c")

>>> print krk

03.04.2005 00:00:00

>>> print type(krk)

<type 'str'>

>>> print krk[:2]

03

strftime() fonksiyonunun önemli bir özelliği vardır. Bu fonksiyon sisteminizde tanımlı olan dil yereline (locale) göre işlem yapar. Yani eğer sisteminizin dil yereli İngilizce ise ay isimleri de tabii ki İngilizce olacaktır.

strftime() fonksiyonunun genellikle şöyle kullanıldığına tanık olursunuz:

>>> bugun = datetime.date.today()

>>> print bugun.strftime("Son güncelleme: %d/%m/%y")

Tarihlerle Aritmetik İşlem Yapmak

Eğer yazdığınız bir programda tarihlere dayalı bir işlem yapıyorsanız, mevcut tarihin öncesini ve sonrasını da bilmeniz gerekebilir. Mesela TCMB’den döviz kuru bilgilerini alan bir program yazıyorsunuz diyelim. En basitinden, mesela doların bir gün öncesine göre yükselip yükselmediğini kullanıcıya gösterebilmek için, bugünün tarihini bilmenin yanısıra bir önceki günün tarihini de bilmeniz gerekir. Hatta örneğin eğer dolar kurundaki haftalık değişimi grafiklerle gösteren bir uygulama yazacaksanız mevcut günün 7 gün öncesine kadar giden tarihleri de alabilmeniz gerekir. Gelin isterseniz bu tür işlemleri nasıl yapabileceğimizi gösteren basit bir örnek verelim:

>>> import datetime
>>> bugun = datetime.date.today()

Böylece bugünün tarihini bulduk. Diyelim ki bugünün tarihi 09.07.2010 Cuma olsun. Siz bu tarihin 1 gün öncesini bulmak istiyorsunuz:

>>> fark = datetime.timedelta(1)
>>> dun = bugun - fark
>>> print dun

2010-07-08

Burada datetime modülü içinde bulunan timedelta() adlı özel bir fonksiyondan yararlandık. Bu fonksiyona verdiğimiz sayı değerli argüman, kaç günlük bir fark üzerinden işlem yapacağımızı gösteriyor. Bizim amacımız 1 günlük fark üzerinden işlem yapmak olduğu için timedelta() fonksiyonuna argüman olarak 1 sayısını verdik.

Daha sonra 1 gün öncesinin tarihi bulabilmek için bugünün tarihinden, fark değişkeninin değerini (yani 1’i) çıkarıyoruz. Böylece bugünün 1 gün öncesi olan 8 Temmuz 2010 tarihini elde ediyoruz. Eğer bir önceki günün haftanın hangi gününe denk geldiğini bulmak istiyorsak şöyle bir şey yazabileceğimizi biliyorsunuz:

>>> print dun.weekday()

3

Demek ki 8 Temmuz 2010 tarihi Perşembeye denk geliyormuş...

Dilerseniz strftime() fonksiyonunu kullanarak doğrudan gün adını da alabilirsiniz:

>>> print dun.strftime("%A")

Perşembe

Bu strftime() fonksiyonunun oldukça geniş bir kullanım alanı vardır. Mesela istihza.com’daki sayfaların en sonuna eklenen “Son güncelleme” tarihini oluşturmak için ben de bu fonksiyon kullanılıyor. Bunun için kullanılan karakter dizisi şöyle:

bugun.strftime('%d/%m/%Y')