2016-04-26 16 views
0

Ich bin neu zu c und versuche auf strptime Funktion, die Zeichenfolge Zeit in Struktur tm konvertiert. Nach der Konvertierung bekomme ich keine richtige Zeit. Alles ist gut, aber das Jahr zeigt falsch an (Standardjahr 1900).strptime funktioniert nicht mit Zeitzone Formatspezifizierer

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

int main() 
{ 
    struct tm tm; 
    char *pszTemp = "Mon Apr 25 09:53:00 IST 2016"; 
    char szTempBuffer[256]; 

    memset(&tm, 0, sizeof(struct tm)); 
    memset(szTempBuffer, 0, sizeof(szTempBuffer)); 
    strptime(pszTemp, "%a %b %d %H:%M:%S %Z %Y", &tm); 
    strftime(szTempBuffer, sizeof(szTempBuffer), "%Y-%m-%d %H:%M:%S", &tm); 

    printf("Last Boot Time after parsed = %s\n", szTempBuffer); 

    return 0; 
} 

Ausgabe: 1900-04-25 09:53:00

+1

Haben Sie überprüft, was ['strptime'] (http://man7.org/linux/man-pages/man3/strptime.3.html) zurückgibt? Damit es keinen 'NULL' Zeiger zurückgibt? –

+0

Haben Sie versucht, mit '-Wall' zu kompilieren? – LPs

+0

@LPs: es hat nicht funktioniert. –

Antwort

1

Wie Sie time.h Quelldatei sehen in können Sie __USE_XOPEN und _GNU_SOURCE zu erklären, bevor time.h

#define __USE_XOPEN 
#define _GNU_SOURCE 

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

int main() 
{ 
    struct tm tm; 
    char *pszTemp = "Mon Apr 25 09:53:00 IST 2016"; 
    char szTempBuffer[256]; 

    memset(&tm, 0, sizeof(struct tm)); 
    memset(szTempBuffer, 0, sizeof(szTempBuffer)); 
    strptime(pszTemp, "%a %b %d %H:%M:%S %Z %Y", &tm); 
    strftime(szTempBuffer, sizeof(szTempBuffer), "%Y-%m-%d %H:%M:%S", &tm); 

    printf("Last Boot Time after parsed = %s\n", szTempBuffer); 

    return 0; 
} 
enthalten

Sie können auch einfach die Definition in Ihren gcc-Befehl einfügen:

gcc -Wall test.c -o test -D__USE_XOPEN -D_GNU_SOURCE 

EDIT

This historical SO post gibt alle Infos über diese definiert.

+1

Können Sie erklären, warum ist das notwendig? Bearbeiten: Danke. – 2501

+0

@ 2501 [Dieser historische SO Post] (http://stackoverflow.com/questions/5378778/what-does-d-xopen-source-do-mean) gibt alle Infos über diese definiert. – LPs

+0

hat es nicht funktioniert. Habe den gleichen Ausgang. –

0

Die% Z funktioniert nicht für strptime, nur für strftime. strptime beendet das Lesen nach% Z. Daher fehlt das 2016.

http://linux.die.net/man/3/strptime

Wenn Sie es sollte glibc verwenden arbeiten.

+0

spielen Sie ein wenig herum mit der Position von% Z und 2016 und Sie können es sehen – kbnl83