2011-03-21 16 views
10

Bir ISO-8601 biçimli tarih/saat dizgisinden time_t ürününe nasıl gidileceğini bilen var mı? C++ kullanıyorum ve Windows ve Mac üzerinde çalışması gerekiyor.ISO 8601 dizesini C++ ile time_t'ye nasıl dönüştürebilirim?

Kodu yazdım ama eminim ki daha standart olan bir sürüm var.

2011-03-21 20:25 gibi bir tarih alacağım ve zamanın geçmişte mi yoksa gelecekte mi olduğunu söylemem gerek.

+2

bir çapraz platform hakkında da benzer bir tartışma var 'strptime' (http://stackoverflow.com/questions/321.849/strptime eşdeğer-on-pencere). Ravenspoint'in yanıtını isteyebilir ve destek kullanabilirsiniz: #include "boost/date_time/posix_time/posix_time.hpp" ' – Tim

cevap

6

Bir struct tm bir dizeye dönüştürmek için strptime kullanabilir ve sonra bir time_t bir struct tm dönüştürmek için mktime kullanabilirsiniz. Örneğin: düşündüğümden

// Error checking omitted for expository purposes 
const char *timestr = "2011-03-21 20:25"; 
struct tm t; 
strptime(timestr, "%Y-%m-%d %H:%M", &t); 
time_t t2 = mktime(&t); 
// Now compare t2 with time(NULL) etc. 
+2

strptime standart değil c. Windows'da mevcut olacak mı? –

+1

@Null Set: Oops haklısın, bunu unuttun. strptime sadece POSIX tarafından tanımlanmıştır. Http://stackoverflow.com/questions/321849/strptime-equivalent-on-windows ve http://stackoverflow.com/questions/667250/strptime-in-windows adresine bakın. –

7

Bir çirkin kesmek eğlenceli olacağını: Sadece/saat daha büyük olan tarih belirlemek istiyorsanız beri dizesine tarih dönüştürmek ve dizeleri karşılaştırabilirsiniz. [Buradan] ;-) (ters her yerde mevcut değildir strptime gerek kalmamasıdır.)

#include <string.h> 
#include <time.h> 

int main(int argc, char *argv[]) 
{ 
    const char *str = "2011-03-21 20:25"; 
    char nowbuf[100]; 
    time_t now = time(0); 
    struct tm *nowtm; 
    nowtm = localtime(&now); 
    strftime(nowbuf, sizeof(nowbuf), "%Y-%m-%d %H:%M", nowtm); 
    if (strncmp(str, nowbuf, strlen(str)) >= 0) puts("future"); else puts("past"); 
    return 0; 
} 
+3

Ben içgüdüsel olarak böyle bir fikre çarpmak ... Ben aslında "YYYYMMDD HHMMSS" biçimidir - ascii karşılaştırmalar aslında çalışır. Risk, tabii ki, gelecekte farklı bir biçimde tarih almaya başlarsa. – Tim

İlgili konular