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.