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 karakteri | Anlamı |
|---|---|
| a | kısaltılmış gün adı [tm_wday] |
| A | tam gün adı [tm_wday] |
| b | kısaltılmış ay adı [tm_mon] |
| B | tam ay adı [tm_mon] |
| c | yerel tarih ve saat gösterimi |
| C | yılın son iki rakamının atılmış hali (00–99) [tm_year] |
| d | ay içindeki gün (01–31) [tm_mday] |
| D | ye eşdeğerdir [tm_mon, tm_mday, tm_year] |
| e | ay içindeki gün (tek basamaklı günlerin önüne boşluk konulur) (␣1–31) [tm_mday] |
| F | ye eşdeğerdir (ISO 8601 gün biçimi) [tm_year, tm_mon, tm_mday] |
| g | hafta tabanlı yılın son iki rakamı (00–99) [ tm_year, tm_wday, tm_yday] |
| G | hafta tabanlı yıl(tamsayı) [ tm_year, tm_wday, tm_yday] |
| h | ye eşdeğerdir [tm_mon] |
| H | saat (00–23) [tm_hour] |
| I | saat (01-12) [tm_hour] |
| j | yıl içindeki gün (001–366) [tm_yday] |
| m | ay (01–12) [tm_mon] |
| M | dakika (00–59) [tm_min] |
| n | yeni satır (\n) karakteri |
| p | AM (öğleden önce) veya
PM (öğleden sonra) ifadelerinin yerel eşdeğeri [tm_hour] |
| r | 12 saatlik zamanın yerel eşdeğeri [tm_hour, tm_min, tm_sec] |
| R | ye eşdeğerdir [tm_hour, tm_min] |
| S | saniye (00–60) [tm_sec] |
| t | tab (\t) karakteri |
| T | ye 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] |
| x | yerel tarih gösterimi |
| X | yerel saat gösterimi |
| y | yılın son iki rakamı (00-99) [tm_year] |
| Y | yıl (tamsayı) [tm_year] |
| z | eğer belirlenebiliyorsa, (ISO 8601 biçimine göre) UTC’ye göre
olan saat farkı (örneğin, ) [tm_isdst] |
| Z | eğ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 taban
a 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.