2016-04-03 48 views
4

Bir time_t ve struct tm arasında dönüştürdüğüm bir tarihim var (saat 00:00:00).DST'yi yok saymak, ancak geçerli kullanıcı için geçerli bir yerel ayarı kullanmak için tarihleri ​​UTC kullanarak ileri ve geri çevirmek güvenli midir?

Basit YYYYAAGG biçiminde bir tarih almak ve bir struct tm o dönüştürmek: I merak edenler için

struct tm my_tm; 
memset(&my_tm, 0, sizeof(my_tm)); 
my_tm.tm_year = str.mid(0, 4).toInt() - 1900; 
my_tm.tm_mon = str.mid(4, 2).toInt() - 1; 
my_tm.tm_mday = str.mid(6, 2).toInt(); 
  • P.S. .: Bir QString (Qt) sahip dolayısıyla mid() ve toInt() üye kullandı. Sonra

Ben time_t bu tarih mktime() kullanarak dönüştürmek:

time_t my_time(mktime(&my_tm)); 

Bu noktada tarih 2016 6 Mart ise (daha doğrusu -1saat) önceki güne tarih değişiklikleri ("20160306", struct tm numaralı telefondan 2016/03/05). Bunun nedeni DST'dir (tm_isdst buna göre ayarlanır).

Ben mktime() başka versiyonu mkgmtime() denir ve bu beklendiği gibi çalışır: Sonra kullanarak struct tm geri tarihini dönüştürebilirsiniz

time_t my_time(mkgmtime(&my_tm)); 

: DST işlev gören göz ardı edilir beri aynı tarihi almak gmtime_r() işlevi. Bu şekilde, yine aynı tarih olsun:

struct tm other_tm; 
gmtime_r(&my_time, &other_tm); 

Ancak, bazı noktada son kullanıcının yerel tanımlanan gibi standart formatta tarih görüntülemek istiyor. Bunun için ICU kütüphanesini kullanıyorum. Aşağıda, ben format_date() çağırmadan önce UTC f_current_timezone değişkeni zorlamak, ardından tarih Mar 6, 2016olarak çıkar (I kullanıcı dilimini tutarsak, bunun yerine Mar 5, 2016 alabilirsiniz.)

QString locale::format_date(time_t d) 
{ 
    QUnicodeString const timezone_id(f_current_timezone); 
    LocalPointer<TimeZone> tz(TimeZone::createTimeZone(timezone_id)); 
    Locale const l(f_current_locale.toUtf8().data()); 
    LocalPointer<DateFormat> dt(DateFormat::createDateInstance(DateFormat::kDefault, l)); 
    dt->setTimeZone(*tz); 
    UDate const udate(d * 1000LL); 
    QUnicodeString u; 
    dt->format(udate, u); 
    return u; 
} 

format_date()'dan doğru sonucu almak için "UTC" yi saat dilimi olarak kullanmak güvenli midir (Bu size bir anlam ifade ediyor mu?)?

cevap

0

mktime()'u kullanmadan önce, tm_hour'u 12'ye (12pm) ayarlayın. Tek yapmanız gereken, uygulamanın yerini kullanarak tarih bölümünü biçimlendirmekse, bu amaçla mktime() için öğlen yeterli olacaktır.

+0

Bunu düşündüm, ama saat diliminiz +12 veya -12 saat ise? Bu etkilenmez mi? –

+0

mktime yerel saat dilimini kullanır. Yerel saat diliminde öğlen ne olursa olsun kullanmaya çalışır. –