2011-10-26 23 views
0

を使用して、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失敗"を取得します。私が最初に入れたのは、bufpatternの両方であることに注意してください。

ヘルプありがとうございます。私の最終目標は、この形式で文字列を変換することです:2011-10-26T08:39:21

+0

ここにコードを正しくコピーしてもよろしいですか?変数 'pattern'は、' strptime'の呼び出しでaddress-of演算子を使用すべきではありません。 –

答えて

3

下ケース%yが世紀内の2桁の年のためであるためです。それを大文字の%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; 
} 

これは、今年は、残りは無視された状態で、2011のちょうど20一部として読み込まれていることを意味し、2020を出力します。大文字の%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値を変更します。私自身の 'のstrptime' と 'タイムスタンプ' コマンドを使用して

+0

+1 '%y'の代わりに'%Y'を試してください。 – cnicutar

+0

ああ、そのようなタイプミス。私はそれが嫌いです。確かに、10の代わりに 'tm_mon:9'が得られますか? –

+1

これは標準です: 'int tm_mon月の年[0,11]'。したがって1月は '1'ではなく' 0'です。 – cnicutar

0

、私が手:

$ 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 
$ 

(。ここでタイムゾーンが米国/太平洋、現在はUTC-7)

'%d/%m/%y'形式ことは、 2011年ではなく2020年に日付を生成します。

関連する問題