2

2012-12-20T01:16:02.05 の形式の日付文字列があり、2011-12-20-01.16.02.050000 の形式に変換したい

現在、私は次のようにやっています

format = "%F-%H.%M.%S.%N"
split(stringinput,input,"T"); 
split(input[1],date,"-")
split(input[2],time,":")

 return strftime(format,mktime(date[1] " " date[2] " " date[3] " " time[1] " " time[2] " " time[3] " " time[4]));

しかし、マイクロ秒情報またはミリ秒情報が失われています。どうすればそれを取得できますか。2011-12-20-01.16.02.%N を返しています

また、文字列の解析をより一般的にするための提案。現在、1 つの形式のみをサポートしています。

ありがとう。

4

3 に答える 3

2

ミリ秒のデータを個別に処理する必要があります。また、を使用gensub()して文字列情報をフォーマットします。次のように実行します:

awk -f script.awk

内容script.awk

BEGIN {

    string = "2012-12-20T01:16:02.05"

    groups = "^(....)-(..)-(..).(..):(..):(..).*"
    format = "\\1 \\2 \\3 \\4 \\5 \\6"

    datespec = gensub(groups, format, "", string)
    timestamp = mktime(datespec)


    newstring = strftime("%F-%H.%M.%S", timestamp)

    sub(/.*\./,"",string)

    printf "%s.%s0000\n", newstring, string
}

結果:

2012-12-20-01.16.02.050000

編集:

BEGIN {

    string = "2011-01-10T14:45:13.815-05:00"

    groups = "^(....)-(..)-(..).(..):(..):(..).*"
    format = "\\1 \\2 \\3 \\4 \\5 \\6"

    datespec = gensub(groups, format, "", string)
    timestamp = mktime(datespec)


    sub(/.*\./,"",string)

    offset = substr(string,4)

    split(offset,array,":")

    seconds = (array[1] * 60 * 60) + (array[2] * 60)

    newstring = strftime("%F-%H.%M.%S", timestamp - seconds, 1)

    printf "%s.%s00\n", newstring, substr(string,0,3)
}

結果:

2011-01-10-09.45.13.81500
于 2013-02-21T06:18:40.417 に答える
1

なぜ mktime() を使用しているのですか? あなたが説明する変更は単なるテキストの変更です:

$ echo "2012-12-20T01:16:02.05" | awk '{sub(/T/,"-"); gsub(/:/,"."); print $0 "0000"}'
2012-12-20-01.16.02.050000

出力で 2012 を 2011 に変更したときのタイプミスだと思います。

于 2013-02-21T12:19:44.520 に答える