2012-08-25 14 views
9

koduna göre artırılması Kodun altında çalışıyorum. Yukarıdaki Programı idam Eğermktime() işlevinin kafa karıştırıcı davranışı: tm_hour sayısının bir

int main() 
{ 
struct tm storage={0,0,0,0,0,0,0,0,0}; 
char *p = NULL; 
p = (char *)strptime("2012-08-25 12:23:12","%Y-%m-%d %H:%M:%S",&storage); 
char buff[1024]={0}; 
strftime(buff,1024,"%Y-%m-%d %H:%M:%S",&storage); 
cout << buff << endl; 
storage.tm_sec += 20; 
strftime(buff,1024,"%Y-%m-%d %H:%M:%S",&storage); 
cout << buff << endl; 
mktime(&storage); 
strftime(buff,1024,"%Y-%m-%d %H:%M:%S",&storage); 
cout << buff << endl; 
return 0; 
} 

, yerine '2012-08-25 00:23:32' arasında '2012/08/25 13:23:32' yazdırır. Lütfen Yardım, neden tm_hour değerini arttırıyor. Bu, giriş tarihini '2012-02-25 12:23:32' olarak girdiğimde, kafa karıştırıcı olan programda doğru şekilde çalışıyor.

çıkışı - sistemimde>

[[email protected] root]$ ./a.out 
2012-08-25 12:23:12 
2012-08-25 12:23:32 
2012-08-25 13:23:32 
[[email protected] root]$ 

Tarih Bilgisi, ->

[[email protected] root]$ date 
Sat Aug 25 08:28:26 EDT 2012 
+0

Kod, saatin arttığını göstermiyor.Bunu yapmak için, “strptime” den gelen sonucu ve ayrıca “mktime” çağrısından gelen sonucu görüntüleyin. Bu, gerçekte olanları düzeltmeye yardımcı olacaktır. –

+0

Üzgünüz, bunu ayrıştıramıyorum. Biri yerine üç çıktı var, ama nereden geldiklerine dair bir gösterge yok. Lütfen çıktıyla eşleştirmek için örnek kodu güncelleyin. –

cevap

11

belirtilen tarih yürürlükte günışığı tasarrufu var ama mktime çağrılırken, storage.tm_isdst sıfırdır

ne olur. mktime bunu görüyor ve "hey, bana yanlış gün ışığı tasarruf bayrağıyla bir tarih verdiler, düzeltelim" diye düşünüyor. Daha sonra tm_isdst değerini 1 olarak ayarlar ve tm_hour'u değiştirir. Ayrıca, this numaralı cevaba da bakınız.

setenv("TZ", "", 1); 
tzset(); 
mktime();
  • iyi Date-kullanın:

    o

    • kullanım timegm yerine (timegm dan da örneğe bakın) mktime çağırmadan önce UTC saat dilimi ayarlayın mktime
    • arasında düzeltmek için zaman kitaplığı (boost::locale::date_time/boost::date_time gibi), ancak Q & A bölümünü okuyun bir tane seçmeden önce boost::locale::date_time sayfasındaki
  • +1

    Teşekkürler, Bu bana yardımcı oldu ve şüphemi açıkladı. Şimdi kod parçamı her iki sistemde de çalıştırmam gerekiyor (DST açık/kapalı). Örneğin. Eğer mktime() 'ı çağırmadan önce tm_isdst = 1 kodunu koyarsam, DST'nin kapalı olduğu sistemde yanlış sonuç verir (bu, tm_hour'un bir azaltılmasıyla sonuçlanır). Verilen tarihe saniyeler eklemenin başka yolu var mı? ("Mktime()" veya "mmtime() 'yı kullanarak, tm_isdst bayrağını yok sayar mıktanı kullanın") –

    +0

    @DhirajNeve: Birkaç düzeltme ekledim. Daha fazla tarih/saat ile ilgili şeyler yapmanız gerekiyorsa, iyi bir C++ tarih/zaman kütüphanesi kullanmanız gerektiğini düşünüyorum. – rve

    +0

    Yalnızca timegm' POSIX değil mi? – stackptr

    4

    Vay, sadece etrafında bir yolu yoktur. Sisteminizin mktime uygulamasında bir hata olmalı (3). mktime (3), kendisine iletilen struct tm * değiştirmemelidir.

    storage.tm_isdst değerini kontrol etmenizi öneririm. DST ile ilgili karışık olmadığından emin olmak için 0'a ayarlamayı deneyin. Bu işe yaramazsa, uygun değeri otomatik olarak belirlemesini sağlamak için -1 değerine ayarlamayı deneyin.

    mktime - convert broken-down time into time since the Epoch

    mktime() Gün Işığı tasarruf zaman, sırası ile, ya da belirli bir süre için geçerli değildir, ilk tahmin neden tm_isdst için bir pozitif ya da 0 değerini

    . Tm_isdst için negatif bir değer, mktime(), Yaz Saati Uygulamasının belirtilen süre için geçerli olup olmadığını belirlemeye çalışmasına neden olur.

    ben mktime (3) struct tm * değiştirerek değil hakkında yanılmışım. Değeri normalleştirmek için doğru davranış.

    +0

    'Man mktime' (http://linux.die.net/man/3/mktime)' a göre, tm 'işlemini yapabilir (ve yapar). Değerlerini normalleştirir ve eksik alanlarda doldurur. – rve

    +0

    @rve doğru gibi görünüyor. İfadeyi yanlış anladım. Time_t ayarı için normalize olduğunu düşündüm. –

    +0

    Evet, uygulama yanlış ... –

    İlgili konular