【问题标题】:Convert date formats in bash在 bash 中转换日期格式
【发布时间】:2011-09-24 10:16:25
【问题描述】:

我有一个格式为“2011 年 6 月 27 日”的日期,我想将其转换为 20110627

可以用 bash 做吗?

【问题讨论】:

    标签: linux bash date awk


    【解决方案1】:
    #since this was yesterday
    date -dyesterday +%Y%m%d
    
    #more precise, and more recommended
    date -d'27 JUN 2011' +%Y%m%d
    
    #assuming this is similar to yesterdays `date` question from you 
    #http://stackoverflow.com/q/6497525/638649
    date -d'last-monday' +%Y%m%d
    
    #going on @seth's comment you could do this
    DATE="27 jun 2011"; date -d"$DATE" +%Y%m%d
    
    #or a method to read it from stdin
    read -p "  Get date >> " DATE; printf "  AS YYYYMMDD format >> %s"  `date
    -d"$DATE" +%Y%m%d`    
    
    #which then outputs the following:
    #Get date >> 27 june 2011   
    #AS YYYYMMDD format >> 20110627
    
    #if you really want to use awk
    echo "27 june 2011" | awk '{print "date -d\""$1FS$2FS$3"\" +%Y%m%d"}' | bash
    
    #note | bash just redirects awk's output to the shell to be executed
    #FS is field separator, in this case you can use $0 to print the line
    #But this is useful if you have more than one date on a line
    

    More on Dates

    请注意,这只适用于 GNU 日期

    我已经读到了:

    Solaris 版本的日期,不能 支持-d 可以解决 替换 sunfreeware.com 版本的 日期

    【讨论】:

    • 有点像我所拥有的然后你也回答了 =P 注意,当我编辑我的答案时你回答了我的问题
    【解决方案2】:

    在 OSX 上,我使用 -f 指定输入格式,使用 -j 不尝试设置任何日期,并使用输出格式说明符。例如:

    $ date -j -f "%m/%d/%y %H:%M:%S %p" "8/22/15 8:15:00 am" +"%m%d%y"
    082215
    

    你的例子:

    $ date -j -f "%d %b %Y" "27 JUN 2011" +%Y%m%d
    20110627
    

    【讨论】:

    • 非常有帮助。 date 在 macOS 上的行为似乎很古怪
    【解决方案3】:
    date -d "25 JUN 2011" +%Y%m%d
    

    输出

    20110625
    

    【讨论】:

      【解决方案4】:

      只需使用 bash:

      convert_date () {
          local months=( JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC )
          local i
          for (( i=0; i<11; i++ )); do
              [[ $2 = ${months[$i]} ]] && break
          done
          printf "%4d%02d%02d\n" $3 $(( i+1 )) $1
      }
      

      然后像这样调用它

      d=$( convert_date 27 JUN 2011 )
      

      或者如果“旧”日期字符串存储在变量中

      d_old="27 JUN 2011"
      d=$( convert_date $d_old )  # not quoted
      

      【讨论】:

        【解决方案5】:

        如果您想要一个可在 Mac OS X 和 Linux 上运行的 bash 函数:

        #
        # Convert one date format to another
        # 
        # Usage: convert_date_format <input_format> <date> <output_format>
        #
        # Example: convert_date_format '%b %d %T %Y %Z' 'Dec 10 17:30:05 2017 GMT' '%Y-%m-%d'
        convert_date_format() {
          local INPUT_FORMAT="$1"
          local INPUT_DATE="$2"
          local OUTPUT_FORMAT="$3"
          local UNAME=$(uname)
        
          if [[ "$UNAME" == "Darwin" ]]; then
            # Mac OS X
            date -j -f "$INPUT_FORMAT" "$INPUT_DATE" +"$OUTPUT_FORMAT"
          elif [[ "$UNAME" == "Linux" ]]; then
            # Linux
            date -d "$INPUT_DATE" +"$OUTPUT_FORMAT"
          else
            # Unsupported system
            echo "Unsupported system"
          fi
        }
        
        # Example: 'Dec 10 17:30:05 2017 GMT' => '2017-12-10'
        convert_date_format '%b %d %T %Y %Z' 'Dec 10 17:30:05 2017 GMT' '%Y-%m-%d'
        

        【讨论】:

          【解决方案6】:

          也许自 2011 年以来发生了一些变化,但这对我有用:

          $ date +"%Y%m%d"
          20150330
          

          -d 无需获得相同的显示结果。

          【讨论】:

          • -d 设置要格式化的日期。没有它,日期会格式化当前日期。
          【解决方案7】:

          这样做就足够了:

          data=`date`
          datatime=`date -d "${data}" '+%Y%m%d'`
          echo $datatime
          20190206
          

          如果您还想添加可以以这种方式使用的时间

          data=`date`
          datatime=`date -d "${data}" '+%Y%m%d %T'`
          
          echo $data
          Wed Feb 6 03:57:15 EST 2019
          
          echo $datatime
          20190206 03:57:15
          

          【讨论】:

          • 它报告:日期:无效日期'Thu 18 Mar 11:58:32 GMT 2021'
          猜你喜欢
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 2021-06-23
          • 2018-08-18
          • 2013-05-22
          • 2016-04-03
          • 2019-08-03
          • 2014-07-17
          相关资源
          最近更新 更多