2011-10-26 2 views
0

Я пытаюсь использовать strptime(buf, &pattern,&result) для преобразования char[], содержащий дату в tm Структура.Порядок элементов в strptime

Я использую функцию, как это:

if(strptime(buf, &pattern,&result) == NULL) 
    { 
     printf("\nstrptime failed\n"); 
... 

и все работает, если мои переменные определены следующим образом:

char buf[] = "26/10/2011"; 
char pattern[] = "%d/%m/%y"; 
struct tm result; 

, но если я изменить их в:

char buf[] = "2011/26/10"; 
char pattern[] = "%y/%d/%m"; 
struct tm result; 

Я получаю «strptime failed». Обратите внимание, что я только ставил год в начале (оба в buf и pattern).

Помогите оценить. Моя конечная цель заключается в преобразовании строки в следующем формате: 2011-10-26T08:39:21

+0

Вы действительно скопировали код именно здесь? Переменная 'pattern' не должна использовать адрес-оператора в вызове' strptime'. –

ответ

3

Это потому, что нижняя часть корпуса %y для двузначного года в века. Попробуйте изменить его на верхний регистр %Y, и он будет работать нормально. Вы можете увидеть это из следующей программы:

#include <stdio.h> 
#include <time.h> 
int main (void) { 
    char buf[] = "26/10/2011"; 
    char pattern[] = "%d/%m/%y"; 
    struct tm result; 
    if (strptime (buf, pattern, &result) == NULL) { 
     printf("strptime failed\n"); 
     return -1; 
    } 
    printf ("%d\n", 1900 + result.tm_year); 
    return 0; 
} 

Это выводит 2020, а это означает, что год читается как только 20 часть 2011, а остальные игнорируются. Если вы используете верхний регистр %Y, он выводит вместо этого правильный 2011.

код, который генерирует ошибку преобразования используя обращенную формат:

#include <stdio.h> 
#include <time.h> 
int main (void) { 
    char buf[] = "2011/10/26"; 
    char pattern[] = "%y/%m/%d"; 
    struct tm result; 
    if (strptime (buf, pattern, &result) == NULL) { 
     printf("strptime failed\n"); 
     return -1; 
    } 
    printf ("%d\n", 1900 + result.tm_year); 
    return 0; 
} 

будет работать нормально (т.е. выход 2011) при изменении значения в "%Y/%m/%d"pattern.

+0

+1 попробуйте '% Y' вместо'% y'. – cnicutar

+0

aaah, такая опечатка ... Ненавижу это. Просто чтобы убедиться, что это нормально, я получаю 'tm_mon: 9' вместо 10? –

+1

Это в стандарте: 'int tm_mon Месяц года [0,11]'. Итак, январь - '0', а не' 1'. – cnicutar

0

Используя свой собственный 'strptime' и 'метку времени' команды, я получаю:

$ strptime -T '%y/%d/%m' 2011/26/11 
strptime: failed to convert <2011/26/11> using format <%y/%d/%m> 
$ strptime -T '%Y/%d/%m' 2011/26/11 
1322294400 = 2011/26/11 
$ strptime -T '%d/%m/%y' 26/11/2011 
1606377600 = 26/11/2011 
$ timestamp 1322294400 1606377600 
1322294400 = Sat Nov 26 00:00:00 2011 
1606377600 = Thu Nov 26 00:00:00 2020 
$ 

(часовой пояс здесь US/Pacific, в настоящее время UTC-7).

Обратите внимание, что формат '%d/%m/%y'

Смежные вопросы