time Modülü

time modülü, Python’da saat/zaman ile ilgili işlemler yapmamızı sağlar. Bu modül işlev olarak az çok datetime() modülüyle benzerlik gösterir.

Python’daki bu time adlı modül, tıpkı öteki modüller gibi içinde birtakım fonksiyonlar barındırır. Dilerseniz bu fonksiyonlar içinde en çok kullanılanı inceleyerek başlayalım konumuza...

sleep() Fonksiyonu

Dediğimiz gibi, bu fonksiyon, time() modülü içinde en sık kullanılan fonksiyondur. sleep() fonksiyonu, yazdığımız bir programın işleyişini belli bir süre durdurmamızı sağlar. İsterseniz buna basit bir örnek verelim:

>>> import time
>>> for i in range(10):
...     time.sleep(1)
...     print i

Gördüğünüz gibi, 0’dan 10’a kadar olan sayılar 1’er saniye aralıklarla ekrana dökülüyor. Programın kaç saniye duracağını, sleep() fonksiyonuna verdiğimiz bir parametre ile belirliyoruz. Biz yukarıdaki örnekte bu parametreyi “1” olarak belirledik. Yani programımızın 1’er saniye aralıklarla çalışmasını istedik...

Gelin isterseniz yukarıdaki bilgiyi kullanarak grafik arayüze sahip bir sayaç yazalım:

from Tkinter import *
import time

pencere = Tk()
pencere.geometry("200x200")

etk = Label(font = "Helvetica 60 bold",
            fg = "steelblue")

etk.pack(pady=50)

a = -1

while True:
    a += 1
    time.sleep(1)
    pencere.update()
    etk["text"] = a

pencere.mainloop()

Yalnız dikkat ettiyseniz bu sayaç programı çalışma sırasında bloke oluyor, yani takılıyor. Program penceresini fare ile sürüklerken bu takılmaları daha iyi görebiliyoruz. Üstelik programı çarpı düğmesinden kapatmaya çalıştığımızda da programda belli bir kasılma göze çarpıyor. Ayrıca program kapanırken hata da veriyor. Bunu engellemek için programınızı çok katmanlı (multi-threaded) bir hale getirebilirsiniz:

# -*- coding: utf-8 -*-

from Tkinter import *
import time
import threading

class GUI(object):
    def __init__(self):
        self.penar_olustur()

    def penar_olustur(self):
        """Pencere araçlarımızı burada oluşturuyoruz.
        Programımız bir etiket ve düğmeden ibaret..."""

        self.etk = Label(font = "Helvetica 60 bold",
                         fg = "steelblue")

        self.etk.pack(pady=50)

        self.btn = Button(text = "KAPAT",
                          relief = "raised",
                          font = "Helvetica 15 bold",
                          fg = "navy")

        self.btn["command"] = self.kapat
        self.btn.pack()

        #Kullanıcı çarpı düğmesine bastığında kapat
        #fonksiyonu devreye girsin. Eğer bunu yapmazsak
        #program yine de kapanacak, ama kapanırken
        #hata verecektir...
        pencere.protocol("WM_DELETE_WINDOW", self.kapat)

    def kapat(self):
        """Programın kapanmasını sağlayan fonksiyon.
        Burada programı tamamen kapatmadan önce
        pencereyi "withdraw" durumuna alıyoruz.
        Böylece sayacın durmasını sağlıyoruz ve programın
        aniden kapanıp hata vermesine engel oluyoruz"""

        pencere.state("withdraw")

        #sayacın düzgün bir şekilde durabilmesi için
        #programımıza 1 saniyelik bir süre tanıyoruz.
        time.sleep(1)

        #Pencere "withdraw" durumuna alındı ve sayacımız
        #durdu. Artık programımızı sona erdirebiliriz.
        pencere.destroy()

pencere = Tk()
pencere.geometry("350x300")
app = GUI()

class Sayac(threading.Thread):
    def run(self):
        sayi = -1
        #pencere durumu "withdrawn" olmadığı sürece
        #sayacımız saymaya devam edecek.
        while pencere.state() != "withdrawn":
            sayi += 1
            time.sleep(1)
            app.etk["text"] = sayi

syc = Sayac()
syc.start()

pencere.mainloop()

strftime() Fonksiyonu

strftime() fonksiyonu yardımıyla gün, yıl, ay, hafta, saat, dakika, saniye gibi bilgileri gösterebiliriz. Örneğin:

>>> import time
>>> time.strftime("%Y")

'2010'

Gördüğünüz gibi, strftime() fonksiyonunu bir parametre ile birlikte kullanıyoruz. Bu örnekteki “%Y” ifadesi yılı göstermemizi sağlıyor. Eğer yılın son iki hanesini görmek istersek şöyle yazabiliriz:

>>> time.strftime("%y")

'10'

Ayı görmek için:

>>> time.strftime("%m")

'08'

Günü görmek için:

>>> time.strftime("%d")

'16'

Ay, gün ve yılı birlikte görmek için:

>>> time.strftime("%x")

'08/16/2010'

Tabii buradaki gösterim ay/gün/yıl şeklinde. Türkiye’deki tarih gösterimi ise gün-ay-yıl şeklindedir. Türkiye’ye uygun bir tarih gösterimi elde etmek için iki yol takip edebilirsiniz. Birincisi:

>>> time.strftime("%d.%m.%Y")

'16.08.2010'

Burada gün, ay ve yıl bileşenlerini uygun sırada ve tek tek belirttik.

İkincisi:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, "tr_TR.UTF-8")
>>> time.strftime("%x")

'16-08-2010'

Burada ise locale modülünden yararlanarak Türkçe yerelleri etkin hale getirdik. Yukarıdaki kullanım GNU/Linux içindir. Windows kullanıcıları yukarıdaki kodları şu şekilde yazabilir:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, "Turkish_Turkey.1254")
>>> time.strftime("%x")

'16.08.2010'

Eğer strftime() modülünü kullanarak saat, dakika ve saniye bilgilerini elde etmek isterseniz şöyle bir şey yazabilirsiniz:

>>> time.strftime("%X")

'2:08:02 PM'

Bu da, tıpkı tarih gösteriminde olduğu gibi, Amerikan sistemine uygun bir saat gösterimidir. Bunu Türkiye sistemine uygun bir hale getirmek için yine locale modülünden yararlanacağız:

>>> locale.setlocale(locale.LC_ALL, "tr_TR.UTF-8")
>>> time.strftime("%X")

'14:08:02'

Gördüğünüz gibi, Amerikan sisteminde 12 saat üzerinden işlem yapılırken, Türkiye sisteminde 24 saat üzerinden işlem yapılıyor.

Burada da, eğer isterseniz saat, dakika ve saniye bilgilerini tek tek alabilirsiniz.

Saati almak için:

>>> time.strftime("%H")

'14'

Dakikayı almak için:

>>> time.strftime("%M")

'13'

Saniyeyi almak için:

>>> time.strftime("%S")

'53'

Elbette bunları birleştirebilirsiniz de:

>>> time.strftime("%H:%M:%S")

'14:13:53'

Bunların dışında, strftime() fonksiyonu ile birlikte kullanılan başka harfler de bulunur. Bu harfleri şöylece özetleyebiliriz:

İfade Anlamı
%a Kısaltılmış gün adı
%A Tam gün adı
%b Kısaltılmış ay adı
%B Tam ay adı
%c Tam tarih ve saat
%d Ondalık sayı cinsinden gün (aya göre)
%H Ondalık sayı cinsiden saat (24 saat hesabına göre)
%I Ondalık sayı cinsinden saat (12 saat hesabına göre)
%j Ondalık sayı cinsinden gün (yıla göre)
%m Ondalık sayı cinsinden ay
%M Ondalık sayı cinsinden dakika
%S Ondalık sayı cinsinden saniye
%U Yıla göre hafta numarası. Pazar haftanın ilk günü olarak alınır
%x Tam tarih
%X Tam saat
%y Yılın son iki hanesi
%Y Tam yıl gösterimi

localtime() Fonksiyonu

localtime() fonksiyonunu kullanarak tarih ve saate ilişkin bütün bilgilerin yer aldığı bir demet elde edebilirsiniz:

>>> time.localtime()

time.struct_time(tm_year=2010, tm_mon=8, tm_mday=16,
tm_hour=16, tm_min=49, tm_sec=42, tm_wday=0,
tm_yday=228, tm_isdst=1)

Bu demette toplam 9 adet değer bulunur ve bu değerlerin anlamı şudur:

Sıra Değer Anlamı
0 tm_year yıl
1 tm_mon ay
2 tm_mday gün
3 tm_hour saat
4 tm_min dakika
5 tm_sec saniye
6 tm_wday haftanın günü (Pazartesi 0)
7 tm_yday yıla göre gün
8 tm_isdst gün ışığından yararlanma uygulamasının olup olmadığını denetler

Bu değerlere şu şekilde ulaşabiliriz:

>>> zaman = time.localtime()
>>> zaman.tm_year

2010

>>> zaman.tm_mon

8 #Ağustos ayı...

>>> zaman.tm_mday

16 #Ayın 16'sı...

>>> zaman.tm_hour

16 #Saat akşam 4

>>> zaman.tm_min

49 #49. dakika

>>> zaman.tm_wday

0 #Pazartesi...

>>> zaman.tm_yday

228 #yılın 228. günü...

>>> zaman.tm_isdst

1 #gün ışığından yararlanma uygulaması etkin

gmtime(), time() ve ctime() Fonksiyonları

Python’da zaman hesaplaması yapılırken “epoch” adlı bir kavramdan yararlanılır. Epoch zamanın başlangıcıdır. Zamanın başlangıcının ne olduğunu bulmak için gmtime() fonksiyonunu kullanabiliriz:

>>> print time.gmtime(0).tm_year

1970

Demek ki “epoch”, yani zamanın başlangıcı 1970 imiş... time() adlı başka bir fonksiyonu kullanarak zamanın başlangıcından bu yana kaç saniye geçtiğini bulabiliriz:

>>> time.time()

1282025564.984

ctime() fonksiyonu ise bize tam tarih ve saat bilgisini gösterir:

>>> time.ctime()

'Tue Aug 17 09:13:47 2010'

time() ve ctime() fonksiyonlarını birlikte kullanarak sonraki bir zamanı hesaplayabiliriz. Mesela şu andan 60 saniye sonrasını hesaplamak için şöyle bir şey yazabiliriz:

>>> sonraki_tarih = time.time() + 60
>>> print time.ctime(sonraki_tarih)

Tue Aug 17 09:17:44 2010

Eğer tam bir saat sonrasını hesaplamak isterseniz şu kodu kullanabilirsiniz:

>>> bir_saat_sonra = time.time() + (60 * 60)
>>> print time.ctime(bir_saat_sonra)

Tue Aug 17 10:18:59 2010