2013-12-16 19 views
5

Ich programmiere ein kleines Programm, um die entsprechenden Dateien herunterzuladen, die von einem meteorologischen Softwarepaket verwendet werden sollen. Die Dateien haben das Format YYYYMMDD und YYYYMMDD HHMM in UTC. Ich möchte die aktuelle Zeit in UTC in C++ wissen und ich bin auf Ubuntu. Gibt es eine einfache Möglichkeit, dies zu tun?Wie bekomme ich die UTC-Zeit

+0

Können Sie die Frage neu formulieren: Möchten Sie _reformat_ die Dateinamen von UTC nach local reaktivieren? Oder möchtest du die aktuelle Zeit als UTC aufrufen? –

+0

Greifen Sie einfach auf die aktuelle Zeit in UTC, Entschuldigung für die Verwirrung, ich werde die Frage bearbeiten. –

Antwort

7

Eine High-End-Antwort in C++ ist die Verwendung von Boost Date_Time.

Aber das kann übertrieben sein. Die C-Bibliothek hat, was Sie in strftime benötigen, die Handbuchseite hat ein Beispiel.

/* from man 3 strftime */ 

#include <time.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    char outstr[200]; 
    time_t t; 
    struct tm *tmp; 
    const char* fmt = "%a, %d %b %y %T %z"; 

    t = time(NULL); 
    tmp = gmtime(&t); 
    if (tmp == NULL) { 
     perror("gmtime error"); 
     exit(EXIT_FAILURE); 
    } 

    if (strftime(outstr, sizeof(outstr), fmt, tmp) == 0) { 
     fprintf(stderr, "strftime returned 0"); 
     exit(EXIT_FAILURE); 
    } 
    printf("%s\n", outstr); 
    exit(EXIT_SUCCESS); 
}   

habe ich ein vollständiges Beispiel auf das, was im Handbuch Seite lautet:

$ gcc -o strftime strftime.c 
$ ./strftime 
Mon, 16 Dec 13 19:54:28 +0000 
$ 
+0

Das Beispiel der strftime-Manpage verwendet localtime(). OP benötigt stattdessen gmtime(), um die UTC-Zeit zu erhalten. – nos

+0

Die Verwendung von strftime scheint die beste Option zu sein. Vielen Dank. Ich kann bei Bedarf manuell in UTC umwandeln, aber ich möchte herausfinden, was nos gesagt hat. –

+0

@nos Wie würde ich DST mit gmtime() berücksichtigen? –

4

Sie können gmtime verwenden:

struct tm * gmtime (const time_t * timer); 
Convert time_t to tm as UTC time 

Hier ein Beispiel:

std::string now() 
{ 
    std::time_t now= std::time(0); 
    std::tm* now_tm= std::gmtime(&now); 
    char buf[42]; 
    std::strftime(buf, 42, "%Y%m%d %X", now_tm); 
    return buf; 
} 

Ideon Verbindung: http://ideone.com/pCKG9K

+4

Sie sollten 'std :: strftime (buf, sizeof buf, ...)' verwenden. Es ist auch erwähnenswert, dass das 'return buf;' nur gültig ist, weil der Wert implizit in eine 'std :: string' konvertiert wird; Wenn 'now' ein' char * 'zurückgibt (wie es wahrscheinlich in C wäre), würden Sie einen Zeiger auf ein lokales Objekt zurückgeben, was ein großes No-No ist. –

+3

Hinweis: Wenn möglich, sollten Sie stattdessen 'gmtime_r' verwenden, das zwar nicht standardgemäß ist, aber sowohl eingangs- als auch datenrennungssicher ist. –

+0

@MatthieuM. Du hast Recht, normalerweise würde ich nach der Existenz von gmtime_r suchen. Ich dachte, es wäre zu viel für diese Antwort. Danke für das nützliche Feedback. – nurettin