UNIXTIME TIMESTAMP NEDİR VE KÜTÜPHANESİZ OLARAK NASIL ÇÖZÜMLENİR

UNIXTIME dediğimiz 10 karakterli saniye cinsinden bir sayıyı, bildiğimiz tarih formatına çevirmek için bir dönüşüm yapmamız gerek. ( 10 karakterli sadece saniye cinsinden sayıdır. Şayet milisaniye olarak yazarsanız buna 3 tane 0 eklemeniz yeterlidir. ) Bu sayının bize getirdiği fayda ise, birçok programda değişmeksizin kullanılması. Tarih formatında yazdığınızda aynı zamanda bir de GMT UTC dediğimiz saat farklılıklarını yazmamız gerekliliğidir. UNIXTIME, her zaman GMT +0 saatine göre hesaplanır. Burada GMT dediğimiz aynı zamanda TIMEZONE denilen zaman bölgesini gösterir. Ülkemizde GMT +3.00 dır.

Saat farkını tarih formatında yazdığımızda gelen tarih 1.1.2022 22:30:00 olduğunda, bir de üzerine gmt+3 saat eklersek, bu kez gün değişimi söz konusu olacaktı. Bizim ülkemizde bu örnek tarihin karşılığı, 2.1.2022 01:30:00 dır. Bu çevrimi yapmak istemiyorsanız UNIXTIME kullanmanız size avantaj sağlayacaktır.

Mesela Aynı örnekteki tarih GMT +0 olan unixtime 1641076200 dır. Bu zamana, GMT +3.00 saat farkını koyarsak saniye cinsinden toplamamız yeter. Bu zaman da 1 saat 3600 sn olduğundan 3*3600=10800 saniyedir. ( Bu da Türkiyenin saniye cinsinden TIMEZONE bilgisidir) Bu bilgiyi ilk tarih için verilen UNIXTIME sayısına eklememiz saat farkını uygulamış olmamız demektir.
1641076200 + 10800= 1641087000 GMT+3.00 eklenmiş tarih için UNIXTIME kodu elde edilir.

Epoch timestamp: 1641076200
Timestamp in milliseconds: 1641076200000
Date and time (GMT): Saturday, 1 January 2022 22:30:00

Epoch timestamp: 1641087000
Timestamp in milliseconds: 1641087000000
Date and time (GMT): Sunday, 2 January 2022 01:30:00

Bu şekilde UNIXTIME kullanmanın avantajını görmüş oluyoruz. Bundan dolayıdır ki internetten aldığınız verilerde unixtime kullanılır ve format sorunu olmaz.

Gelen UNIXTIME kodu her zaman için GMT +0 zaman bölgesine aittir. Ülke zamanı, hangi zaman bölgesindeyse onu kendiniz eklersiniz. UNIXTIME 1.1.1970 00:00:00 dan itibaren geçen saniyelerin toplamını gösterir. Aslında sayı, işaretli bir 32 bit sayı olduğundan 1.1.1900 yılından başlar. Sıfır noktasını 1.1.1970 sayısında bulundurur ve biz de bu tarihten sonra saydığı saniyeleri hesaplarız. Şayet bu tarihten önceki tarihe gitmek isterseniz eksi değer vermeniz gerekir.
(işaretli 32 bit sayı ne demek:
1111 1111 1111 1111 1111 1111 1111 1111
yukarıdaki sayı 32 bit işaretsiz bir sayıdır. İşaretli olduğunda ise en soldaki bit 0 ise pozitif 1 ise negatif bir sayıyı belirtir.)

Bu tarih kodu hangi tarihe kadar doğru çalışır.
Bu tarih kodlaması 32 bit işaretli bir sayının maksimum sayısına kadardır. Bu tarih ise 2038 yılıdır. Aynı 2000 yılı milenyum sorunu gibi bu da 2038 de başlayacaktır.
Mutlaka o zamana kadar bir çözüm bulunacaktır.

Fakat ne yapılırsa yapılsın milenyumdaki gibi bir sorun olacak. Bu tarihi kontrol eden cihazlar yeni programlama şekline geçirilecek. Çöp olmak zorunda kalmayacaktır. Şayet program güncelleme yapılabiliyorsa.

Milenyum Y2K sorunu 4 karakterli yılın son 2 karakterini kullanmaktan dolayı olmuştu. Bilgisayarlar o zamana kadar yılın son 2 hanesini kullanır ve başında 19 olduğu varsayımına göre davranırdı. Yıl 2000 olduğunda ise yine 2 karakter gösterdiğinde tarih, 2000 yerine standart 19 kullanıldığı için 1900 senesini göstermeye başlardı.

Bunun gibi 2038 den sonra da UNIXTIME sorunu ortaya çıkıp 2038 yılını gösteren sayıdan
– sayıya geçer ve bu kez geçmişe gidecektir.
32 bit işaretli sayı demek -2.147.483.647 sayısından başlar sıfıra gider ve sonrasında 2.147.483.647 sayısına gider. Bu sayıya 1 saniye eklesek en başa -2.147.483.647 sayısına döner.
Son tarih :
Epoch timestamp: 2147483647
Timestamp in milliseconds: 2147483647000
Date and time (GMT): Tuesday, 19 January 2038 03:14:07

Mesela aşağıdaki linkte bulunan sayfaya gidip 32 bitten büyük bir sayı verseniz orası size çok daha ileri bir tarihi gösterecektir. Fakat artık bu sayı 32 bitten fazla olacağından unixtime kodu olmayacaktır. https://www.epochconverter.com/

64 bit sistemlerde bile standart zaman depolama alanı, 32 bit ise sorun yaratacaktır.
Yeni sistemler 64 bit tasarlandığından ve bu bilgi de uzun zamandır bilindiğinden önlemler alınacaktır.
Asıl sorun programlama yaptığımız derleyiciler buna hazır mı? Sistemsel olarak o zamana kadar yeni versiyonlar çıkacak ve bu sorun çözülecektir.

Gelelim bizim bu sayıyı nasıl çözebileceğimize.

Bu sayının 10 karakterli saniye cinsinden sayı olduğunu söylemiştik. Tarih formatındaki bir sayıyı belli saniye katsayılarıyla işlem yaparak, son sayı oluşturulur. Biz de bunun tersini yaparak bildiğimiz tarih formatına çevireceğiz.

Saniye cinsinden tablo:

Human-readable time 

Seconds

1 hour

3600 seconds

1 day

86400 seconds

1 week

604800 seconds

1 month (30.44 days)

2629743 seconds

1 year (365.24 days)

 31556926 seconds

Yukarıdaki tabloya ve bu zaman koduna göre hesabımızı yapalım.
Zaman kodu : 1649713626

Resimde bu dönüşüm formülleri ve artık yıllarda hafta sayısının nasıl olduğunu gösterir. 52. hafta artıkyıl’a göre, bir sonraki yıla sarkar. Bu excel programı tüm dokümanlar arasında yer almaktadır.

Yukarıdaki resimdeki formüllere göre tarih formatına çevirebiliriz.
Örnek vermek gerekirse : YIL= 1649713626 /31556926=52,2773 Bu sayının tamsayı kısmı bize 1970 ten sonraki farkı verir. Bu da 52 sayısıdır. Bu sayıyı başlangıç yılı 1970 ile toplarsak 2022 yılına ulaşırız.

Bu işlemleri yaparken elbet virgülden sonra sayılar kalacak. Bundan dolayı işlemlerde bazen bölme bazen de kalan gerektiğinden modüler aritmetik kullanarak sonuca ulaşacağız. Resimde Arduino programındaki formülleri görüyorsunuz. Bu formüllere göre hazırlanan EXCEL dosyasını programlar arasında bulabilirsiniz.  (Formüller ARDUINO örneğindendir. Oradaki % işareti MOD alma işlemidir)

Arduinoda kafa karıştıracak olan yerler olacak. Bunlar ay hesaplamasında +1 verilmesi gibi. Bunun sebebi ise bölme sonucu 3,2 çıktığında 3 tam ay bitmiş, bir de 0.2 ay geçmiş diyoruz. Tabii ki bu yeni ayı da +1 olarak biz ekliyoruz çünkü yeni aydan gün almıştır.

Ayrıca ayın ismi ve gün ismi de bulunması gerektiğinden 2 ayrı dizimiz var. Bunlar Ay isimlerini ve gün sayılarını tutan dizilerdir. Ay sayısına göre ismini okuyoruz. Ayların gün sayısına göre de ayın, hangi gününde olduğumuzu buluyoruz.
Bunun yanı sıra da LEAP YEAR denilen ARTIK YIL kontrolü var. Hepimizin bildiği gibi 4 e bölünen aylarda Şubat 29 gündür. Bunu da program içinde artık yıl kontrolü yaparak buluyoruz ve şubat 29 çekecek şekilde hesaplama yapıyoruz.

Ayrıca hafta sayısı ve haftanın günü var. Burada da günlerin isimlerini tutan bir dizi var. Haftanın Birinci Günü pazartesi olacak şekilde dizi düzenlenmiştir.
Hangi hafta dediğimizde, yılda 52 hafta var diyoruz. ( Herkes böyle biliyor bu da doğru ) Fakat Her yıl 52. Haftanın birkaç günü yeni yıla denk geliyor. Excel resminde gördüğünüz gibi artık yıl durumuna göre bu sayı 0-3 gün arasında değişiyor. Yani 52. Hafta dediğinizde aynı yıl olmayabilir bir sonraki yılın ilk gününden bahsediyor olabilirsiniz.
Bu kısımda programda kontrol ediliyor.

Saat kısmına gelirsek, daha öncede söylediğim gibi verilen unixtime kodu GMT +0 kodudur. Bu kodu GMT +3:00 koduna döndürmek için, yani 3 saat eklemek için de bir bölüm var. Burada +3 saat ekleniyor. Fakat +3 saat eklediğinizde gün bir sonraki güne gidiyor olabilir. Böyle bir hesaplama sonucu olursa, o zaman, ay, gün, hafta ve yıl yeni hesap sonucuna göre hesaplanıyor.

Arduino programı bu kadar ayrıntıya girmek zorunda kalıyor. Fakat Excel de formüller basit tutulduğundan, ne artık yıl, ne de GMT hesaplaması yapılmıyor.

NOT: Arduino programı bazı şartları gerçekleştirecek şekilde denense bile yeni yapılan her program gibi bazı eksiklikler ya da hatalar olabilir. Herhangi bir hata bulursanız yorum kısmına bırakırsanız düzeltmeye çalışırım. Program da hatasız olur. 

Diyeceksiniz ki, Kütüphane var. Başka türlü çözümler var buna ne diye ihtiyacım olsun.

Elbette haklısınız. Fakat kütüphane kullanmak onun nasıl yapıldığını bilmemek, ileride yapacağınız programlamalarda sizi eksik bırakabilir. Mesela bir yerde programlama yapmanız gerek. Fakat o programlama da kütüphane örneği yok. Bu programı yapamam mı diyeceksiniz.
Elbette kütüphane işi kolaylaştırır. Fakat nasıl yapıldığını bilirseniz, siz de kütüphane olmaksızın yapabilirsiniz.

Bununla birlikte bazı çözümlere de yer vermek istiyorum.
Mesela Arduino ve ESP ile bir hava durumu sitesinden veri aldınız ve size unix time kodu geldi. Bunu çözüp ekrana yazmalısınız. Arduinoya kütüphane eklemenize gerek yok. Madem ki ESP ile bilgi alıyorsunuz O zaman, bu zaman kodunu da internette bir siteye gönderip orada çözülmesini sağlayabilirsiniz. ESP ile kullanılacaksa, Bu link HTTPS: olduğundan ESP nin security SSL ile ilgili kütüphanesini de kullanmanız gerekir.
Örnek site link :  https://unixtime.co.za/

Bu siteden bilgi almak için siteye kendi zaman kodunuzu gönderiyorsunuz ve bu zaman kodunu site çözüp, size geri yolluyor.
Örnek : https://showcase.api.linx.twenty57.net/UnixTime/fromunix?timestamp=1549892280

Yukarıdaki link kısmında, son kısma kendi zaman kodunuzu yazıp, ESP ile gönderebilirsiniz ve cevabı tarih formatında alabilirsiniz.

Ayrıca kendi sitenizde bedava bir PHP dosyası oluşturup, PHP üzerinde çözülmesini sağlayıp, size tarih formatında vermesini sağlayabilirsiniz. Bu çalışma için Örnek program, dosyalar arasında var. Kendi sitenize yükleyebilirsiniz. ( PHP dosyaları direkt olarak bilgisayarınızda çalışmaz bir bedava site edinip oraya koymanız gerek. Ya da bilgisayarınızda php sunucu oluşturmanız gerek.) Bu konu videoda gösterilecektir.

TIMEZONE nedir aşağıdaki resimde görebilirsiniz. 

https://upload.wikimedia.org/wikipedia/commons/8/88/World_Time_Zones_Map.png

Dünya çevresi dikey olarak (Sanal olarak) 360 meridyene bölünmüştür. Zamanlama olarak her dikey çizgi (meridyen) arası 4dk dır. Her 15 meridyen 1 saate tekabül eder. TIMEZONE dediğimiz kısım 15 meridyenlik bölüntüdür. Türkiye ise İstanbul olarak bakarsak GMT +2:00 timezone bölgesindedir. Fakat yaz saati uygulaması kalıcı olduğundan GMT +3:00 noktası kabul edilir.
Türkiyenin Dünyadaki lokasyonu 26-45 doğu meridyeni ve 36-42 Kuzey paralelidir.
26-30 arası GMT +2:00 30-45 meridyeni arası ise GMT +3:00 arasındadır. Bunu GMT +3 olarak görebilirsiniz. GMT (Greenwich Mean Time) Yani zaman için sıfır noktasıdır. Buradan +3 ve -3 gibi doğuya doğru ve batıya doğru timezone bilgisini alır. UNIXTIME her defasında GMT +0 olarak gelir. Kullanıcı hangi zaman bölgesindeyse onu üzerine ekler. GMT +3 denildiğinde 3*3600sn=10800sn. Türkiye için eklenecek saniyedir. İnternetten gelen bilgileri TR olarak istediğinizde timezone=10800 olarak gelir. 

PHP için Link:
http://mikrobotikradyo.ml/api/openweather/clocksade1.php?ut=2147483647

Yukarıdaki linkte son kısımdaki numarayı unixtime numarasıyla değiştirip yollayın. PHP sizin değerinize karşılık gelen tarih formatına göre tarihi verecek. GMT +3 olarak size dönecek. PHP dosyasını düzenleyerek istediğiniz timezone bölgesine göre verilmesini sağlayabilirsiniz.

Dikkat diğer verdiğim link https olduğundan, esp nin SSL kütüphanesi gerekiyordu. Bu verdiğim php linki http olduğundan, SSL kısmına ihtiyaç bulunmaz.

PHP dosyasının içeriği buradadır.

<?php

if (isset($_GET[‘ut’]) ) {

$unitime = $_GET[‘ut’];
// $status= $_GET[‘status’];

date_default_timezone_set(“Europe/istanbul”);
$t=$unitime;
//$t=time();
echo(date(“d-m-Y “,$t ));
echo(date(“H:i:s O”,$t));
}
?>

 

Ayrıca Mit app inventor ile de çözüm sağlayabilirsiniz.

MIT app inventor ile bir APK hazırlayıp unixtime kodunu bluetooth ile telefonunuza gönderip oradan çözülmüş değerini de sisteminize aktarabilirsiniz. Hatta EASYLCD_MOBILE_UNIXTIME1 programını kullanarak bluetooth üzerinden eski telefonlarınızı Hem LCD ekran hem de UNIXTIME çevirici olarak kullanabilirsiniz. Sayfanın sağ tarafındaki kategorilerden EASYLCD_MOBILE seçerseniz, bu konuda yapılmış örnek çalışmaların yazılarını da görebilirsiniz.
Komut ise UNI1649842557 dir. Bu komutu EASYLCD_MOBILE_UNIXTIME1 komutu aldığında, bu kodun karşılığında tarih formatında size geri döndürür. Uygulamayı denemek için, PC den bluetooth ve REALTERM gibi bir programı kullanıp, komutu gönderebilirsiniz. İllaki arduino ve bluetooth kullanmak zorunda değilsiniz.

Şayet bana sadece çevirici yapmam için örnek program ver derseniz, size bu programı da veriyorum. UNIXTIME_convert.aia Bu program sadece örnektir. ekranda verdiğiniz UNIXTIME kodunu tarih formatına çevirir. Sizler bunu geliştirebilirsiniz.

Ayrıca bu siteden de çevirme işlemiyle birlikte tarihsel bilgilere ulaşabilirsiniz.

https://www.epochconverter.com/

https://www.epochconverter.com/days/2022

https://www.epochconverter.com/weeks/2022

Birinci link unixtime converter sitesi
ikinci site yine bu siteye bağlı gün tablosu.
üçüncü site ise aynı siteye bağlı Hafta tablosudur.
Bunları incelediğinizde hangi gün hangi hafta ayrıca yeni yıla sarkan hafta ve gün hangisi, bunları bulabilirsiniz.

Tüm programlara ve dokümanlara buradan ulaşabilirsiniz.

Proteus üzerinde de deneyebilirsiniz. 
Arduino ile deneme yapabileceğiniz gibi sizlerde proteus üzerinde arduino kullanarak denemelerinizi yapabilirsiniz. Github üzerinden proteus dosyasını indirip arduino programını deneyebilirsiniz. Verdiğim proteus dosyası eski versiyon olduğundan tüm proteuslarda çalışacaktır. Proteus programında arduino programının yolunu göstermeniz gerek hepsi bu. Arduino ide de HEX dosyasını çıkarıp proteusta kullanmak istediğinizde, menülerden TASLAK kısmını seçip, içindeki DERLENMİŞ BİNARY’İ ÇIKAR seçeneğini seçin. Hex dosyasını ise proteustaki arduinoya tanımlayın hepsi bu.


 

 

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir