如何在shell脚本中将一种日期格式转换为另一种格式?
旧格式是
MM-DD-YY HH:MM
但我想将其转换为
YYYYMMDD.HHMM
答案 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 | ... |
我希望这会有所帮助。