Parse Date in Bash

前端 未结 10 1653
灰色年华
灰色年华 2020-11-29 02:17

How would you parse a date in bash, with separate fields (years, months, days, hours, minutes, seconds) into different variables?

The date format is: YYYY-MM-D

10条回答
  •  时光取名叫无心
    2020-11-29 02:43

    Another solution to the OP's problem:

    IFS=' -:' read y m d h m s<<<'2014-03-26 16:36:41'
    

    Converting a date to another format with BSD date and GNU date:

    $ LC_ALL=C date -jf '%a %b %e %H:%M:%S %Z %Y' 'Wed Mar 26 16:36:41 EET 2014' +%F\ %T
    2014-03-26 16:36:41
    $ gdate -d 'Wed Mar 26 16:36:41 EET 2014' +%F\ %T
    2014-03-26 16:36:41
    

    GNU date recognizes Wed and Mar even in non-English locales but BSD date doesn't.

    Converting seconds since epoch to a date and time with GNU date and BSD date:

    $ gdate -d @1234567890 '+%F %T'
    2009-02-14 01:31:30
    $ date -r 1234567890 '+%F %T'
    2009-02-14 01:31:30
    

    Converting seconds to hours, minutes, and seconds with a POSIX shell, POSIX awk, GNU date, and BSD date:

    $ s=12345;printf '%02d:%02d:%02d\n' $((s/3600)) $((s%3600/60)) $((s%60))
    05:25:45
    $ echo 12345|awk '{printf "%02d:%02d:%02d\n",$0/3600,$0%3600/60,$0%60}'
    05:25:45
    $ gdate -d @12345 +%T
    05:25:45
    $ date -r 12345 +%T
    05:25:45
    

    Converting seconds to days, hours, minutes, and seconds:

    $ t=12345678
    $ printf '%d:%02d:%02d:%02d\n' $((t/86400)) $((t/3600%24)) $((t/60%60)) $((t%60))
    142:21:21:18
    

提交回复
热议问题