| 
		* Önsöz 
 
        	* Giriş* Veri Tipleri, Değişkenler
 * Operatörler
 * Temel G/Ç Fonksiyonları
 * Temel Kütüphane Fonksiyonları
 * Karşılaştırma Deyimleri
 * Döngüler
 * Fonksiyonlar I
 * Fonksiyonlar II
 * Diziler
 * Gösterici (Pointer) Kavramı
 * Katarlar (Stringler)
 * Dinamik Bellek Yönetimi
 * Gösterici Uygulamaları
 * Yapılar ve Birlikler
 * Dosya Yönetimi
 * Bit Düzeyinde Çalışmak
 * Port Denetimi
 * Grafik Kullanımı
 * C Makroları
 
 
        	* Kısaca C++* Derleme Seçenekleri
 * Tarih-Saat Fonksiyonları
 * Monte-Carlo Yöntemleri
 * Fortran ve C
 
 
        	* Yararlanılan Kaynaklar
 
		* Dev-C++ * Salford (silversoft FTN95)
 * GCC
 * Turbo C
 * Eclipse IDE
 * NetBeans IDE
 
 
		* programlama.com * C Programcıları Derneği
 
 
		* C (wikipedia)* C++ (wikipedia)
 * cplusplus.com
 * koders.com
 * Hot scripts
 
 
		 |  | 
 Ders 23: Tarih ve Saat Fonksiyonları
 
En son güncelleme: Wed, 30 Nov 2011 13:22:02 +0200| ###################- (%95) |  
 Giriş
 
  Bazı uygulamalarda program içerisinde tarih ve saat bilgilerine ihtiyaç duyulabilir. C dilinde, tarih ve saat fonksiyonlarının
  bildirimleri, semblik sabitler ve standart yapılar <time.h> başlık dosyasında tanımlanmıştır.
  Bu fonksiyonlar üç temel işlevi yerine getirir:
 
    Bu bölümde tarih ve saat fonksiyonları incelenmişitir. Takvim (Tarih) bilgileri
     Yerel Saat
     Saat Dilimleri
 
 23.1   time() Fonksiyonu 
time() fonksiyonu 01/01/1970 tarihinden, programın çalıştığı tarihe ve  saate  kadar geçen sürenin saniye
cinsinden değerini gönderir. Genel bildirimi:
 
      time_t time(time_t *zaman);
şeklindedir. Burada:
      time_t sayısal bir tip (genllikle long int) olup zaman bilgisini temsil eder.
      zaman tarih bilgisini tutan gösterici  tipinde bir değişkendir.
 
 
01/01/1970'den bu güne geçen süreyi iki yolla öğrenebiliriz:| NOT 
  Derleyici tarih bilgisi göstermezse time() fonksiyonu -1 değerini gönderir.
 |  
Şimdi örnek uygulamayı Program 23.1'de görelim:Geri dönüş değerini kullanarak
time_t t;
...
t = time(NULL);
printf("zaman: %ld\n",t);
fonksiyon parametresinden
time_t t;
...
time(&t);
printf("zaman: %ld\n",t);
 Program 23.1: time() fonksiyonunun kullanımı
 
| 01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
 | /* 23prg01.c: time() fonksiyonun kullanımı */
#include <stdio.h>
#include <time.h>
int main ()
{
  time_t saniye;   /* long saniye; anlamında */
  saniye = time (NULL);
  puts("01/01/1970'den bu gune kadar gecen sure,");
  printf ("Saniye olarak  %ld\n", saniye);
  /* 1 saat = 60*60 = 3600 sn. */
  printf ("Saat olarak    %ld\n", saniye/3600);
  /* 1 gün = 24 saat = 24*60*60 = 86400 sn. */
  printf ("Gun olarak     %ld\n", saniye/86400);
 return 0;
} | 
 
ÇIKTI
 
| 
01/01/1970'den bu gune kadar gecen sure,
Saniye olarak  1227606397
Saat olarak    341001
Gun olarak     14208
 |  
 23.2   ANSI C Tarih-Saat Fonksiyonları, Sabitleri ve YapılarıTablo 23.1'de ANSI C'de <time.h> başlık dosyasında bildirilen tarih-saat fonksiyonları listelenmiştir. Tablo 18.1: time.h'te tanımlı tarih-saat fonksiyonları
 
    | Fonksiyon Bildirimi | Açıklama |  
   | char *asctime(const struct tm *zmn_g); | zmn_g göstericinin işaret ettiği veriyi, daha anlaşılabilir bir formatla katar bilgisine çevirir.
	zmn_g göstericisi, gmtime() ve localtime() fonksiyonlarının döndürdüğü, 
        tm yapısını gösterir. Geri döndürelen katarın genel formatı: Www Mmm dd hh:mm:ss yyyy
	şeklindedir. Burada Www haftanın günü, Mmm ay bilgisi, dd ayın günü
	hh:mm:ss saat bilgisini ve yyyy yıl bilgisidir.
 |  
   | clock_t clock(void); | Zaman tik-tak bilgisini döndürür. |  
   | char *ctime(const time_t *zaman); | Geriye anlaşılır formatta yerel zamanı tutan bir katar döndürür.
	zaman, time_t tipinde bir uzun tamsayıdır. Katarın formatı:
	Www Mmm dd hh:mm:ss yyyy şeklindedir. |  
   | double difftime(time_t zaman1, time_t zaman2); | zaman2 - zaman1 farkını saniye cinsinden hesaplar. |  
   | struct tm *gmtime(const time_t *zaman); | zaman'ı tm yapısına (İngiltere'deki Greenwitch'göre GMT cinsinden) çevirir.
	zaman genellikle time fonksiyonu ile döndürülür. |  
   | struct tm *localtime(const time_t *zaman); | zaman'ı tm yapısına (yerel saat cinsinden) çevirir.
	zaman genellikle time fonksiyonu ile döndürülür. |  
   | time_t mktime(struct tm *zaman); | tm tipinde, zaman göstericisine ait tarih-saat bilgisini gösterir. |  
   | time_t time(time_t *zaman); | 1 Ocak 1970'den bu ana kadar geçen sürenin zaman saniye cinsinden hesaplar. |  
   |  |  |  
   | CLK_TCK | (clock ticks per second) makro sabit. Zaman tik-takları ve zamanın saniye cinsinden karşılığı arasında ilişkiyi tanımlar.
	Bu sabit Turbo C'de #define CLK_TCK 18.2
 şeklinde tanımlanmıştır.
 |  
   | clock_t ve time_t | clock() ve time() fonksiyonlarının kullandığı veri tipleri. 
	Bunlar genellikle  genllikle long int tipleridir ve <time.h> başlık dosyasında
	şöyle tanımlıdır. typedef long clock_t
 typedef long time_t
 |  
asctime(), gmtime(), localtime() 
ve  mktime() fonksiyonlarının kullandığı tm yapısı söyledir:
 
struct	tm {
	int	tm_sec;    /* saniye,    (0 - 59) */
	int	tm_min;    /* dakika,    (0 - 59) */
	int	tm_hour;   /* saat,      (0 - 23) */
	int	tm_mday;   /* ayın günü, (1 - 31) */
	int	tm_mon;    /* ay,        (0 - 11), 0 = Ocak */
	int	tm_year;   /* yıl - 1900 */
	int	tm_wday;   /* haftanın günü, (0 - 6), 0 = Pazar */
	int	tm_yday;   /* yılın günü,(0 - 365) */
	int	tm_isdst;  /* gündüz  (-1/0/1)     */
};
Program 23.2: 
 
| 01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
 | /* 23prg02.c: asctime() ve localtime() fonksiyonlarının kullanımı */
#include <stdio.h>
#include <time.h>
int main()
{
  time_t t;
  struct tm *zaman_bilgisi;
  time (&t);
  zaman_bilgisi = localtime (&t);
  printf("Su anki tarih ve saat: %s",asctime(zaman_bilgisi));
 return 0;
}
 | 
 
ÇIKTI
 
| 
Su anki tarih ve saat: Tue Nov 25 15:19:20 2008
 |  Program 23.3: 
 
| 01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
 | /* 23prg03.c: ctime() fonksiyonunun kullanımı */
#include <stdio.h>
#include <time.h>
main()
{
  time_t t;
  time(&t);
  printf("Su anki tarih ve saat: %s",ctime(&t));
 return 0;
}
 | 
 
ÇIKTI
 
| 
Su anki tarih ve saat: Tue Nov 25 17:08:02 2008
 |  Program 23.4: 
 
| 01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
 | /* 23prg04.c: clock() fonksiyonunun kullanımı */
#include <stdio.h>
#include <time.h>
void bekle(int zaman)
{
  clock_t son;
  son =  clock() + zaman * CLK_TCK;
  while( clock() < son) {}
}
int main()
{
  int n;
  printf ("Geri sayim basladi...\n");
  for (n=10; n>0; n--)
  {
    printf ("%d\n",n);
    bekle(1000);
  }
  printf ("ATES!\n");
 return 0;
}
 | 
 
ÇIKTI
 
| 
Geri sayim basladi...
10
9
8
7
6
5
4
3
2
1
ATES!
 |  Program 23.5: 
 
| 01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
 | /* 23prg03.c: difftime() fonksiyonunun kullanımı */
#include <stdio.h>
#include <time.h>
int main ()
{
  time_t basla, bit;
  char   ad[256];
  double fark;
  time (&basla);
  printf ("Lutfen adinizi girin: ");
  gets (ad);
  time (&bit);
  fark = difftime(bit, basla);
  printf("Merhaba %s.\n", ad);
  printf("Adini yazman %lf saniye surdu.\n",fark);
 return 0;
} | 
 
ÇIKTI
 
| 
Lutfen adinizi girin: Ahmet
Merhaba Ahmet.
Adini yazman 2.000000 saniye surdu.
 |  Program 23.6: 
 
| 01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
 | /* 23prg06.c: mktime() fonksiyonunun kullanımı */
#include <stdio.h>
#include <time.h>
int main ()
{
  time_t t;
  struct tm *zaman;
  int yil, ay, gun;
  char *haftanin_gunu[] = { "Pazar", "Pazartesi",
                             "Sali",  "Carsamba",
                             "Persembe", "Cuma", "Cumartesi"};
  /* tarih bilgisini oku  */
  printf("Yılı girin: ");  scanf ("%d",&yil);
  printf("Ayı  girin: ");  scanf ("%d",&ay);
  printf("Gunu girin: ");  scanf ("%d",&gun);
  /* simdiki zaman bilgisini al */
  t = time(NULL);
  zaman = localtime(&t);
  zaman->tm_year = yil - 1900;
  zaman->tm_mon  = ay - 1;
  zaman->tm_mday = gun;
  /* mktime fonksiyonun cagir */
  mktime(zaman);
  printf("Girilen tarihteki gun  %s.\n", haftanin_gunu[zaman->tm_wday]);
  return 0;
} | 
 
ÇIKTI
 
| 
Yılı girin: 2003
Ayı  girin: 8
Gunu girin: 1
Girilen tarihteki gun  Cuma.
 |  Program 23.7: 
 
| 01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
 | /* 23prg07.c: gmtime() fonksiyonunun kullanımı */
#include <stdio.h>
#include <time.h>
#define TUR  (2)
#define ALM  (1)
#define ABD (-8)
int main()
{
  time_t t;
  struct tm *ptm;
  time (&t);
  ptm = gmtime(&t);
  printf("Su anki yerel saatler\n");
  printf("Istanbul   : %02d:%02d\n", ptm->tm_hour + TUR, ptm->tm_min);
  printf("Berlin     : %02d:%02d\n", ptm->tm_hour + ALM, ptm->tm_min);
  printf("Los Angeles: %02d:%02d\n", ptm->tm_hour + ABD, ptm->tm_min);
 return 0;
}
 | 
 
ÇIKTI
 
| 
Su anki yerel saatler
Istanbul   : 18:34
Berlin     : 17:34
Los Angeles: 08:34
 |  Program 23.8: 
 
| 01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
 | /* 23prg08.c: gerçek zamanı gösterimi */
#include <stdio.h>
#include <time.h>
int main()
{
  time_t t;
  struct tm *zmn;
   puts("Cikis icin: CTRL+C");
   /* Sonsuz döngü */
   while(1)
   {
     time(&t);
     zmn = localtime(&t);
     printf("%02d:%02d:%02d\r",
            zmn->tm_hour, zmn->tm_min, zmn->tm_sec);
   }
 return 0;
} | 
 
ÇIKTI
 
| 
Cikis icin: CTRL+C
17:08:43
 |  
 23.3   Mili Saniye ve Mikro Saniye Düzeyinde Çalışmak 
  Bazı uygulamalarda saniyenin (s) alt birimleri, salise (sl), mili saniye (ms) ve mikro saniye (μs), 
  düzeyinde çalışmak gerekebilir.
  Birçok derleyici, saniyenin belli kesirlerine kadar erişime izin veren fonksiyonları bünyesinde barındırır.
  Ancak, bu fonksiyonlar satandart C'de mevcut değildir. 
 
 
| NOT 
  1 sl = (1/100) s = 0,01 s1 ms = (1/1000) s = 0,001 s
 1 μs = (1/1000000) s = 0,000001 s
 |  
  gcc derleyicisinde <sys/time.h> başlık dosyası içinde tanımlı, gettimeofday()
  fonksiyonu ile mikro-saniye düzeyine erişim mümkündür.
 Program 23.9: 
 
| 01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
 | /* 23prg09.c: saniyenin alt birimleri 
   Derleyici gcc 4.1.2                  */
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main()
{
  struct timeval tv;
  struct timezone tz;
  struct tm *tm;
  long int sa, dk, sn, us;
  double   sl, ms;
  gettimeofday(&tv,&tz);
  tm = localtime(&tv.tv_sec);
  sa = tm->tm_hour;        /* saat         */
  dk = tm->tm_min;         /* dakika       */
  sn = tm->tm_sec;         /* saniye       */
  sl = tv.tv_usec/1.0e4;   /* salise       */
  ms = tv.tv_usec/1.0e3;   /* mili-saniye  */
  us = tv.tv_usec;         /* mikro-saniye */
  printf("%02ld:%02ld:%02ld ; %lf  %lf  %ld\n",
           sa, dk, sn,  sl, ms, us);
 return 0;
} | 
 
ÇIKTI
 
| 
13:53:38 ;  65.247900  652.479000  652479
 |  
Program çalıştırıldığı andaki saniye 38 değerini göstermektedir. 
Daha doğrusu, program çalıştığı anda sistem saatinin saniye göstergesi 38. saniyeden 39. saniyeye geçmektedir.
Çıktıdaki 652479 rakamı, 38. ve 39. saniyeler arası geçen zamanın μs cinsinden değeridir.
Yani, saniyenin alt birimi 38 s + 652479 μs = 38.652479 s. demektir.
 
 
  Turbo C deleyicisinde, mili-saniye düzeyinde kadar erişim izni vardır. 
  Bunun için, program içerisinde <sys/timeb.h> başlık dosyasında tanımlı ftime() 
  fonksiyonu kullanılabilir.
 Program 23.9b: 
 
| 01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
 | /* 23prg09b.c: saniyenin alt birimleri
   Derleyici Turbo C 2.0              */
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
int main()
{
  struct   tm    *zmn;
  struct   timeb *tb;  
  int      sa, dk, sn;
  double   sl, ms;
  
  sa = zmn->tm_hour;     /* saat   */
  dk = zmn->tm_min;      /* dakika */
  sn = zmn->tm_sec;      /* saniye */
  sl = tb->millitm/10.0; /* salise */
  ms = tb->millitm;      /* mili-saniye */
  ftime(tb);
  printf("%02d:%02d:%02d | %lf %lf\n", sa, dk, sn,  sl, ms);
 return 0;
} | 
 
ÇIKTI
 
| 
13:56:16 ;  35.600000  356.000000
 |  
 |