timestamp

Başlatan SpeedyX, 16 Ocak 2013, 11:12:31

SpeedyX

Merhaba Arkadaşlar,

İşletim sistemi içermeyen uygulamalarımda kullanmak üzere tick / date-time fonksiyonları üzerinde çalışıyorum

bir fonksiyon yıl ay gün saat dakika saniye içeren bir struct alıp 32 bit tick (saniye yada dakika bazlı) değeri döndürecek,
diğer fonksiyon ise tick değeri alıp gerçek zaman struct ını dolduracak.

Birkaç denemem oldu yalnız bir türlü internetteki unix timestamp dönüştürücüleriyle aynı değerleri elde edemiyorum.
time.h içindeki localtime ve mktime fonksiyonlarını da denedim, orada durum daha da vahim, her seferinde farklı değerler döndürüyor, stabil değil.

Sizin bu işler için kullandığınız fonksiyonlarınız var mı? Paylaşırsanız bazı sorunları hızlı çözmede yardımcı olur diye düşünüyorum.

Saygılar.

fatih6761

Hocam öncelikle soruyu anlayalım.
Alıntı Yapİşletim sistemi içermeyen uygulamalarımda kullanmak üzere
derken Platform-Bağımsız ( cross-platform )  mu kastdettiniz? Böyle bir kod yok maalesef.
Her işletim sisteminde Date-Time yapıları farklı. Dolayısıyla işletim sisteminden bağımsız yazamazsınız.

SpeedyX

Merhaba,

İşletim sistemi ile çalışmayan, 8-16-32 bit mikrokontrolörlerde timestamp sistemi için örneğin saniye cinsinde tutulan ve her saniye timer kesmesinde arttırılan zaman bilgisini gerçek yyMMddHHmmss zaman bilgisine, gerçek zaman bilgisini de timestamp (saniye cinsinden tick) bilgisine çeviren fonksiyonlardan bahsediyorum. Bu zamana kadar bu tarz bir çok fonksiyon yazdım, başkaları neler kullanıyor onu merak ediyorum. Ayrıca ikisini birbirine dönüştüren hiç yazmamıştım, şu an yazıyorum, hazır bulursam değerlendirmek istiyorum.

mufitsozen

unix/linux sistemlerinde time() ve mktime() fonksiyonlari kullanilir.

kaynak icin bir ornek: http://lxr.free-electrons.com/source/kernel/time.c
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

SpeedyX

#4
Ama ben işletim sistemsiz ortamda kullanmak amacıyla custom code kullanıyorum... Özellikle de tekrar tekrar belirttim işletim sistemsiz. İlk mesajımda da time.h localtime mktime vs.. fonksiyonlarını denediğimi yazdım.
Sanırım kimsenin öyle şeylere ihtiyacı olmuyor.
Ayrıca time.h fonksiyonları C ile yazılan tüm sistemlerde kullanılır, sadece unix de değil.

Cevaplar için teşekkürler.

CoşkuN

Bir de bu timestamp dönüşümlerinde "epoch" denilen başlangıç  olarak kabul edilen tarihler var. Bu Unix, Windows vs.. platformlar için farklı farklı oluyor. Bunlara da dikkat etmek lazım:

http://en.wikipedia.org/wiki/Epoch_(reference_date)

kantirici

#6
Bende de soru işareti oluştu, şimdi biz pic için  pic c de time.h'ı include edip zaman bilgisi alabilirmiyiz? Eğer direk alamıyorsak bu kütüphane ne için kullanılıyor?

mufitsozen

Alıntı yapılan: SpeedyX - 16 Ocak 2013, 20:45:09
Ama ben işletim sistemsiz ortamda kullanmak amacıyla custom code kullanıyorum... Özellikle de tekrar tekrar belirttim işletim sistemsiz. İlk mesajımda da time.h localtime mktime vs.. fonksiyonlarını denediğimi yazdım.
Sanırım kimsenin öyle şeylere ihtiyacı olmuyor.
Ayrıca time.h fonksiyonları C ile yazılan tüm sistemlerde kullanılır, sadece unix de değil.

Cevaplar için teşekkürler.

Verilen cevaba daha dikkatli bakarsaniz mktime fonksiyonunun isletim sisteminden bagimsiz olarak istediginiz hesaplamayi yaptigini goreceksiniz:

mktime(const unsigned int year0, const unsigned int mon0,
314        const unsigned int day, const unsigned int hour,
315        const unsigned int min, const unsigned int sec)
316 {
317         unsigned int mon = mon0, year = year0;
318
319         /* 1..12 -> 11,12,1..10 */
320         if (0 >= (int) (mon -= 2)) {
321                 mon += 12;      /* Puts Feb last since it has leap day */
322                 year -= 1;
323         }
324
325         return ((((unsigned long)
326                   (year/4 - year/100 + year/400 + 367*mon/12 + day) +
327                   year*365 - 719499
328             )*24 + hour /* now have hours */
329           )*60 + min /* now have minutes */
330         )*60 + sec; /* finally seconds */
331 }
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

SpeedyX

Merhaba,

Cevaplar için teşekkürler.

Bu işlem Epoch a göre yapılıyor, sıkıntı şu ki ticks to datetime dönüşümünü doğru yapabilen bir örnek bulamadım, kendim yazıyorum. Bulduğum örneklerde bir döngü oluşturup datetime verip ticks aldıktan sonra tekrar ticks verip datetime alırsam ve döngü başına dönersem, birkaç iterasyonda ticks ya sıfırlanıyor yada 32 bit overflow.. Normalde bu işi sonsuz defa da yapsam ticks ve datetime değerlerinin değişmemesi lazım. Aynı durum mktime vs de de var, ki zaten mktime bildiğimiz anlamda epoch timestamp hesaplamaz.

Bunun dışında, örnekteki mktime benim istediğim şeyin yakınından bile geçmiyor, bunu yapabilmesi için en azından ayların kaç çektiğini bilmesi gerekiyor. Sadece leapyear a bakarak olmaz.
const uint8_t calendar [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

mktime unix timestamp döndürmez, bu koda bakınca da anlaşılıyor!

X-Fi

Merhaba hiç timestamp ile uğraşmadım ama haftanın gününü hesaplayan bir fonksiyon kullanıyorum belki bir fikir verebilir.

const uint8_t  Week_Day_List[12]  = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};


uint8_t Week_Day_Search(uint8_t Year, uint8_t Month, uint8_t Day)
{
      if(Month<3)
            Year-=1;
      return (Year + Year/4 - Year/100 + Year/400 + Week_Day_List[Month-1] + Day) % 7;
}
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

SpeedyX

O fonksiyon Tøndering's algorithm diye geçiyor, http://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week

Konu iyice saptı. Konu çözülmüş kabul edip kapatalım :)

Teşekkürler arkadaşlar.