Standart C Programlama Dili


8.4. Zaman Fonksiyonları

Zamanla ilgili on tane standart fonksiyon bulunmaktadır. Gerekli bildirimler time.h adlı başlık dosyasında bulunmaktadır.

Şu anki takvim zamanını elde etmek için time fonksiyonunu çağırın. Sonuç, genelde uzun bir tamsayıya denk gelen, time_t tipindendir. Eğer zaman elde edilebilir değilse, bu fonksiyon -1 döndürür:

printf("%ld\n", time(NULL));

difftime fonksiyonu iki time_t argümanı alır ve bunlar arasındaki zaman farkının saniye cinsinden verildiği bir double döndürür. Örneğin, uzun bir işlemin ne kadar gerçek zaman aldığını belirlemek için:

time_t z = time(NULL);
/* uzun işlem */
printf("%lf\n", difftime(time(NULL),z));

kullanılabilir.

Takvim zamanını yerel zamana dönüştürmek için, localtime fonksiyonunu kullanın. Örnek:

time_t z = time(NULL);
struct tm * yzg = localtime(&z);
if (yzg != NULL)
  printf("%4d-%02d-%02d %02d:%02d:%02d\n",
    yzg->tm_year+1900, yzg->tm_mon+1, yzg->tm_mday,
    yzg->tm_hour, yzg->tm_min, yzg->tm_sec);
else
  printf("Yerel saat alinamiyor.\n");

gmtime fonksiyonu takvim zamanını (eskiden Greenwich Ortalama Zamanı olarak bilinen) Eş Güdümlü Evrensel Zamana çevirmek için kullanılır. Örneğin, yukarıdaki örnekte, localtime yerine gmtime kullansaydık, yerel saat yerine UTC saati alacaktık.

Yukarıdaki örnekten farklı olarak, zamanı görüntülemek için karakter dizisine çeviren bir fonksiyon da vardır. asctime fonksiyonu argümanı tarafından işaret edilen yapı içindeki zamanı standart biçimde bir karakter dizisine dönüştürür. Ayrıca,

ctime(zg)

çağrısı

asctime(localtime(zg))

çağrısına eşdeğerdir. Yani yerel zamanı bir karakter dizisine dönüştürür.

mktime fonksiyonu argümanı tarafından işaret edilen yapı içindeki yerel zamanı takvim zamanına dönüştürür ve sonucu time_t şeklinde döndürür. Ayrıca yapı içindeki tm_wday ve tm_yday değerlerini doğru bir şekilde doldurur. Eğer sonuç ifade edilemeyen bir zaman ise, -1 döndürülür. Aşağıdaki örnekte 10 Kasım 1938 tarihinin haftanın hangi gününe denk geldiğini hesaplıyoruz:

static char * gunadi[] = {
  "Pazar", "Pazartesi", "Sali", "Carsamba",
  "Persembe", "Cuma", "Cumartesi", "-bilinmiyor-"
};
struct tm yz;
yz.tm_year = 1938 - 1900;
yz.tm_mon = 11 - 1;
yz.tm_mday = 10;
yz.tm_hour = 0;
yz.tm_min = 0;
yz.tm_sec = 0;
yz.tm_isdst = -1;
if (mktime(&yz) == (time_t)(-1))
  yz.tm_wday = 7;
printf("%4d-%02d-%02d %s\n", yz.tm_year+1900,
  yz.tm_mon+1, yz.tm_mday, gunadi[yz.tm_wday]);

Program çalışmaya başladığından beri ne kadar işlemci zamanı kullandığını öğrenmek için, clock_t tipinden sonuç döndüren, clock fonksiyonunu çağırın. Döndürülen değerin saniyeye çevrilmesi için CLOCKS_PER_SEC değişmezine bölünmesi gerekmektedir:

printf("%lf\n", clock()/(double)CLOCKS_PER_SEC);

Şu anki yöreye uygun olarak tarih ve saatler içeren karakter dizileri hazırlamak için strftime fonksiyonu kullanılabilir. Dört tane argümanı vardır: Sonuçta uygun olarak biçimlendirilmiş karakter dizisini içerecek bölgeye bir karakter göstergesi; bu karakter dizisine konulacak en fazla karakter sayısını gösteren size_t tipinde bir sayı; printf’tekine benzeyen bir kontrol karakter dizisi ve zaman bilgisini içeren yapıya bir gösterge. Normalde olduğu gibi, önüne % konan, kontrol karakter dizisindeki dönüşüm tanımlamaları zaman unsurlarını belirtirler ve sonuçtaki karakter dizisinde, kullanılmakta olan yöreye uygun olarak biçimlendirilmiş ilgili zaman bilgileri ile değiştirilirler. Diğer karakterler, tıpkı printf gibi, değiştirilmeden bırakılırlar. Dönüşüm tanımlamaları ve anlamları şöyledir:

Dönüşüm karakteriAnlamı
akısaltılmış gün adı [tm_wday]
Atam gün adı [tm_wday]
bkısaltılmış ay adı [tm_mon]
Btam ay adı [tm_mon]
cyerel tarih ve saat gösterimi
Cyılın son iki rakamının atılmış hali (00–99) [tm_year]
day içindeki gün (01–31) [tm_mday]
D%m/%d/%yye eşdeğerdir [tm_mon, tm_mday, tm_year]
eay içindeki gün (tek basamaklı günlerin önüne boşluk konulur) (␣1–31) [tm_mday]
F%Y-%m-%dye eşdeğerdir (ISO 8601 gün biçimi) [tm_year, tm_mon, tm_mday]
ghafta tabanlı yılın son iki rakamı (00–99) [tm_year, tm_wday, tm_yday]
Ghafta tabanlı yıl (tamsayı) [tm_year, tm_wday, tm_yday]
h%bye eşdeğerdir [tm_mon]
Hsaat (00–23) [tm_hour]
Isaat (01-12) [tm_hour]
jyıl içindeki gün (001–366) [tm_yday]
may (01–12) [tm_mon]
Mdakika (00–59) [tm_min]
nyeni satır (\n) karakteri
pAM (öğleden önce) veya PM (öğleden sonra) ifadelerinin yerel eşdeğeri [tm_hour]
r12 saatlik zamanın yerel eşdeğeri [tm_hour, tm_min, tm_sec]
R%H:%Mye eşdeğerdir [tm_hour, tm_min]
Ssaniye (00–60) [tm_sec]
ttab (\t) karakteri
T%H:%M:%Sye eşdeğerdir (ISO 8601 saat biçimi) [tm_hour, tm_min, tm_sec]
u(Pazartesi gününden başlamak koşuluyla) haftanın günü (1–7) [tm_wday]
U(Pazar gününden başlamak koşuluyla) yıl içindeki hafta sayısı (00-53) [tm_year, tm_wday, tm_yday]
V(ISO 8601’e göre) yıl içindeki hafta sayısı (01-53) [tm_year, tm_wday, tm_yday]
w(Pazar gününden başlamak koşuluyla) hafta içindeki gün (0–6) [tm_wday]
W(Pazartesi gününden başlamak koşuluyla) yıl içindeki hafta sayısı (00-53) [tm_year, tm_wday, tm_yday]
xyerel tarih gösterimi
Xyerel saat gösterimi
yyılın son iki rakamı (00-99) [tm_year]
Yyıl (tamsayı) [tm_year]
zeğer belirlenebiliyorsa, (ISO 8601 biçimine göre) UTC’ye göre olan saat farkı (örneğin, -0430) [tm_isdst]
Zeğer belirlenebiliyorsa, yerel saat diliminin (kısaltılmış) adı [tm_isdst]
%%

Bazı dönüşüm karakterlerinin önüne E veya O konulduğunda, farklı bir biçim veya dönüşüme neden olabilir. strftime, en sondaki \0 hariç, oluşturulan karakter sayısını döndürür. Eğer bu sayı ikinci argümandan büyük veya eşitse, 0 döndürülür ve dönüşümün başarısız olduğu anlaşılır.

timespec_get fonksiyonu ikinci argümanı tarafından verilen tabana göre o anki takvim zamanını ilk argümanı tarafından gösterilen yapının içine koyar. Örneğin:

struct timespec ts;
if (timespec_get(&ts, TIME_UTC))
  printf("%ld,%09ld saniye\n", ts.tv_sec, ts.tv_nsec);

eğer sistem tarafından destekleniyorsa, epoch zamanından o ana kadar geçmiş olan süreyi nanosaniye cinsinden görüntüler. Bu fonksiyonu time fonksiyonunun yerine, daha hassas zaman bilgisi gerektiren durumlarda kullanabilirsiniz.