在Shell中转换日期

时间:2011-12-22 16:04:15

标签: shell unix date

如何在shell脚本中将一种日期格式转换为另一种格式? 示例:

旧格式是

MM-DD-YY HH:MM

但我想将其转换为

YYYYMMDD.HHMM

4 个答案:

答案 0 :(得分:2)

"20${D:6:2}${D:0:2}${D:3:2}.${D:9:2}${D:12:2}00"类似,如果是$D变量中的旧日期。

答案 1 :(得分:2)

利用shell的单词拆分和位置参数:

date="12-31-11 23:59"
IFS=" -:"
set -- $date
echo "20$3$1$2.$4$5"  #=> 20111231.2359

答案 2 :(得分:0)

已经有一个很好的答案了,但你说你想在评论中找到一个替代方案,所以这里是我的[比较可怕的]方法:

read sourcedate < <(echo "12-13-99 23:59");
read sourceyear < <(echo $sourcedate | cut -c 7-8);
if [[ $sourceyear < 50 ]]; then
read fullsourceyear < <(echo -n 20; echo $sourceyear);
else
read fullsourceyear < <(echo -n 19; echo $sourceyear);
fi;
read newsourcedate < <(echo -n $fullsourceyear; echo -n "-"; echo -n $sourcedate | cut -c -5);
read newsourcedate < <(echo -n $newsourcedate; echo -n $sourcedate | cut -c 9-14);
read newsourcedate < <(echo -n $newsourcedate; echo :00);
date --date="$newsourcedate" +%Y%m%d.%H%M%S

所以,第一行只是读取日期,然后我们得到两位数的年份,然后我们根据它是否小于50来追加到'20''19'(所以这会给你1950年到2049年 - 随意转移线。然后我们附加一个连字符和月份和日期。然后我们追加一个空格和时间,最后我们追加':00'作为秒(再次随意制作你自己的默认值)。最后,我们使用GNU日期来读取它(因为它现在已经标准化)并以不同的格式打印(您可以编辑)。

它比剪切字符串要长得多,而且更加丑陋,但是在最后一行中使用格式可能是值得的。你也可以用你在第一个答案中学到的速记来显着缩短它。

祝你好运。

答案 3 :(得分:0)

 myDate="21-12-11 23:59"
 #fmt is DD-MM-YY HH:MM
 outDate="20${myDate:6:2}${myDate:3:2}${myDate:0:2}.${myDate:9:2}${myDate:12:2}00"

 case "${outDate}" in 
    2[0-9][0-9][0-9][0-1][0-9][0-3][0-9].[0-2][0-9][0-5][[0-9][0-5][[0-9] ) 
      : nothing_date_in_correct_format 
    ;; 
    * ) echo bad format for ${outDate} >&2
    ;; 
 esac

请注意,如果您要处理大型文件,则上述过程非常昂贵(ish)。对于基于文件的数据,我建议使用类似

的内容
 cat infile
 ....|....|21-12-11 23:59|22-12-11 00:01| ...|

 awk '
    function reformatDate(inDate) {
       if (inDate !~ /[0-3][0-9]-[0-1][0-9]-[0-9][0-9] [0-2][0-9]:[0-5][[0-9]/) {
         print "bad date format found in inDate= "inDate
         return -1
       }
       # in format assumed to be DD-MM-YY HH:MM(:SS)
       return (2000 + substr(inDate,7,2) ) substr(inDate,4,2) substr(inDate, 1,2) \
              "." substr(inDate,10,2) substr(inDate,13,2) \
               ( substr(inDate,16,2) ?  substr(inDate,16,2) : "00" )
    }
    BEGIN {       
       #add or comment out for each column of data that is a date value to convert
       # below is for example, edit as needed.
       dateCols[3]=3
       dateCols[4]=4
       # for awk people, I call this the pragmatic use of associative arrays ;-)

       #assuming pipe-delimited data for columns
       #....|....|21-12-11 23:59|22-12-11 00:01| ...|
       FS=OFS="|"
    }
    # main loop for each record
    {
       for (i=1; i<=NF; i++) {
         if (i in dateCols) {
            #dbg print "i=" i "\t$i=" $i
            $i=reformatDate($i)
         }
       }
       print $0
    }' infile

<强>输出

... | ... | 20111221.235900 | 20111222.000100 | ... |

我希望这会有所帮助。