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ıylamid()
vetoInt()
ü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?)?
Bunu düşündüm, ama saat diliminiz +12 veya -12 saat ise? Bu etkilenmez mi? –
mktime yerel saat dilimini kullanır. Yerel saat diliminde öğlen ne olursa olsun kullanmaya çalışır. –