2013-12-16 13 views
5

Programuję mały, mały program, aby pobrać odpowiedni zestaw plików do użycia przez pakiet oprogramowania meteorologicznego. Pliki mają format: YYYYMMDD i YYYYMMDD HHMM w UTC. Chcę poznać aktualny czas w UTC w C++ i jestem na Ubuntu. Czy istnieje prosty sposób na zrobienie tego?Jak uzyskać czas UTC

+0

Czy możesz powtórzyć pytanie: czy chcesz _reformatować nazwy plików z UTC na lokalny? Czy chcesz _access_ aktualny czas jako UTC? –

+0

Po prostu uzyskaj dostęp do bieżącego czasu w UTC, przepraszam za zamieszanie, będę edytować pytanie. –

Odpowiedz

7

Wysokiej klasy odpowiedź w C++ to użycie funkcji Boost Date_Time.

Ale to może być przesada. Biblioteka C ma to, czego potrzebujesz w strftime, strona podręcznika ma przykład.

/* 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); 
}   

dodałem pełny przykład na podstawie tego, co jest w podręczniku stronie:

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

Przykład strony podręcznika strftime używa czasu lokalnego(). OP będzie potrzebował funkcji gmtime(), aby uzyskać czas UTC. – nos

+0

Użycie strftime wydaje się być najlepiej wyglądającą opcją. Dzięki. W razie potrzeby mogę ręcznie przekonwertować UTC, ale chcę sprawdzić, co powiedział nos. –

+0

@nos Jak mogę uwzględnić DST przy użyciu gmtime()? –

4

Można użyć gmtime:

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

Oto przykład:

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; 
} 

ideone link: http://ideone.com/pCKG9K

+4

Powinieneś użyć 'std :: strftime (buf, sizeof buf, ...)'. Warto również zauważyć, że 'return buf;' jest poprawny tylko dlatego, że wartość jest niejawnie przekonwertowana na 'std :: string'; jeśli 'now' zwróci' char * '(jak prawdopodobnie w C), zwrócisz wskaźnik do lokalnego obiektu, co jest dużym nie-nie. –

+3

Uwaga: jeśli to możliwe, możesz zamiast tego używać 'gmtime_r', który, podczas gdy jest niestandardowy, jest zarówno bezpieczny dla uczestników, jak i dla danych. –

+0

@MatthieuM. masz rację, normalnie mam sprawdzić istnienie gmtime_r. Myślałem, że to była przesada dla tej odpowiedzi. Dzięki za przydatne opinie. – nurettin

Powiązane problemy