2015-03-05 13 views
5

Aşağıdaki kod var:dönüştürme struct tm time_t için

struct tm time; 

strptime("27052010", "%d%m%Y", &time); 

cout << "sec: " << time.tm_sec << "\n"; 
cout << "min: " << time.tm_min << "\n"; 
cout << "hour: " << time.tm_hour << "\n"; 
cout << "day: " << time.tm_mday << "\n"; 
cout << "month: " << (time.tm_mon + 1) << "\n"; 
cout << "year: " << time.tm_year << "\n"; 

time_t t = mktime(&time); 

cout << "sec: " << time.tm_sec << "\n"; 
cout << "min: " << time.tm_min << "\n"; 
cout << "hour: " << time.tm_hour << "\n"; 
cout << "day: " << time.tm_mday << "\n"; 
cout << "month: " << (time.tm_mon + 1) << "\n"; 
cout << "year: " << time.tm_year << "\n"; 

cout << "time: " << t << "\n"; 

çıktısı: mktime() değiştireceğim time değerlerini yapar ve neden dönüştürülmüş neden

sec: 1474116832 
min: 32767 
hour: 4238231 
day: 27 
month: 5 
year: 110 

sec: 52 
min: 0 
hour: 6 
day: 2 
month: 9 
year: 640 
time: 18008625652 (Fri, 02 Sep 2540 04:00:52 GMT) 

Benim sorum time_t, giriş tarihime eşit değil. Çıktının 1970'den beri saniyeler içinde ifade edilen tarih olduğunu tahmin ediyorum (27.05.2010 = 1330905600). peşin

+2

'mktime' çağrısından önce time.tm_hour',' time.tm_min' ve 'time.tm_sec' değerleri nasıldı? – Wintermute

+0

@Wintermute Bilgileri ekledim. – aQuip

+3

Err ... başlatılmamış bir yapıyı aldınız, birçok alanından üçünü başlattınız, daha sonra "dönüştürdünüz" (üç anlamlı değer artı bir sürü çöp), daha sonra alanları geri okuyor ve neden daha çok çöp aldığınızı merak ediyorsunuz? ;-) GIGO, gerçekten. – DevSolar

cevap

6

mktime yılında

teşekkürler time_t dönüştürmeden önce tüm argümanları normalleştirir. Saat, dakika ve saniye için büyük değerleriniz var, bu yüzden hepsi uygun gün sayısına dönüştürülüyor, değeri geleceğe taşıyor.

Sen mktime çağırmadan önce tm arasında (saat/dakika/saniye dahil) diğer önemli özelliklerini sıfır dışarı gerekir. Bir yorumda belirtildiği gibi, onu sıfır olarak sıfırlayın: tm time = {0}; (etiketli C++, böylece önde gelen struct gerekli değildir). Ayrıca, tm_isdst değerini -1 olarak ayarlamak isteyebilirsiniz, böylece DST (sıfır olarak başlatılmışsa) varsayımından ziyade gün ışığından yararlanma değerini belirlemeyi dener.

+0

Tüm değerleri manuel olarak sıfırlamaktan daha akıllı bir yol var mı? Özür dilerim C. – aQuip

+0

ile gerçekten tanışmadım. Yine de çok teşekkürler. – aQuip

+0

"sıfır saat/dakika/saniye" yetersiz. Tm_yday, tm_wday' gibi tüm alanların "tm_isdst" ve potansiyel diğerleri de dahil olmak üzere başlatılması ve toplam alan kümesinin tanımlanmasının gerekmediği, "bu niteliklere basit bir şekilde atanması" anlamına geleceği. kod, hepsinin ne olduğunu bilmedikçe, tüm alanları başlatmamış olabilir. – chux