2016-04-26 6 views
0

Я новичок в c и пробовал на strptime функции, которая преобразует строковое время в структуру tm. После преобразования я не получаю время. все в порядке, но год отображается неправильно (дефолт 1900 года).strptime не работает с спецификатором формата часового пояса

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

Выход: 1900-04-25 09:53:00

+1

Вы проверили, что ['strptime'] (http://man7.org/linux/man-pages/man3/strptime.3.html) возвращается? Чтобы он не возвращал указатель «NULL»? –

+0

Вы пытались скомпилировать с опцией '-Wall'? – LPs

+0

@ LPs: это не сработало. –

ответ

1

Как вы можете видеть в time.h исходный файл, который вы должны объявить __USE_XOPEN и _GNU_SOURCE, прежде чем включить 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; 
} 

Вы также можете просто добавить определение в команду gcc:

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

EDIT

This historical SO post дает все Infos об этих Определяет.

+1

Можете ли вы объяснить, почему это необходимо? Редактировать: Спасибо. – 2501

+0

@ 2501 [Этот исторический SO post] (http://stackoverflow.com/questions/5378778/what-does-d-xopen-source-do-mean) дает всю информацию об этих определениях. – LPs

+0

это не сработало. Получил одинаковый вывод. –

0

% Z не работает для strptime, только для strftime. strptime перестает читать после% Z. Поэтому 2016 год отсутствует.

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

Если вы используете GLibC он должен работать.

+0

немного поиграйте с позицией% Z и 2016, и вы можете это увидеть – kbnl83