66479


シェルを使ってyyyymmdd形式の変数をunixtimeに変換したい。

起きてる問題として変数に格納するとエラーが発生します。

[code]

    date +%s --date "2005-01-01 00:00"
    結果
    1104505200
    
[/code]

直のstringならエラーは起きないが、変数だとエラーが出る。

[code]

    unitime='2005-01-01 00:00'
    date +%s --date $unitime
    結果
    date: extra operand ‘00:00’
    Try 'date --help' for more information.
    
[/code]

## やりたいこと「yyyymmddhhmm」の文字列をunixtimeに変換

[code]

    unitime='202003020000'
    date +%s --date $unitime
    結果
    date: invalid date ‘202003020000’
    
[/code]

この結果から、どうもフォーマッティング関数が必要なので探しているのですが見つかりません。  
お詳しい方いましたらご助力お願いします。


CC BY-SA 4.0
2020-05-10T07:04:54.490
66478
2020-05-10T08:56:00.797
2020-06-17T08:14:45.997
-1
36855
question
shellscript unix
シェルを使ってyyyymmdd形式の変数をunixtimeに変換したい。


「--date」に与える引数が空白を挟んで分割されて「--date
2005-01-01」と「00:00」と別れて解釈されているのが原因です。日付文字列をダブルクォーテーションで囲んであげれば良いと思います。

[code]

    unitime='2005-01-01 00:00' ; date +%s --date "$unitime"
    1104505200
    
[/code]


CC BY-SA 4.0
2020-05-10T07:13:19.670
66479
2020-05-10T07:13:19.670
30745
66478
answer


【回答】  
`yyyymmddhhmm形式`の文字列を`yyyy-mm-dd hh:mm`形式に変換し、`date +%s --date`を実行するコードです。

【コード】

[code]

    unitime='200501010000'
    date_time=$(
      printf "%s" ${unitime} | {
        read -n 4 yyyy
        read -n 2 mm
        read -n 2 dd
        read -n 2 HH
        read -n 2 MM
        printf "%s-%s-%s %s:%s" ${yyyy} ${mm} ${dd} ${HH} ${MM}
      }
    )
    date +%s --date "${date_time}"
    
[/code]

【結果】

[code]

    1104505200
    
[/code]

* * *

`POSIX complient なシェル`では動かないとの指摘をいただきましたので、sedによる実装例も紹介します。

[code]

    unitime='200501010000'
    date_time=$(echo "${unitime}" | sed -n 's/\(....\)\(..\)\(..\)\(..\)\(..\)/\1-\2-\3 \4:\5/p')
    date +%s --date "${date_time}"
    
[/code]


CC BY-SA 4.0
2020-05-10T08:07:50.560
66483
2020-05-10T08:56:00.797
2020-05-10T08:56:00.797
35558
35558
66478
answer