Linux Bash下如何将04/01/2024 16:30:00转换为Jan 04 2024 16:30:00
解决Bash中日期格式解析错误的问题
问题核心:输入日期04/01/2024 16:30:00实际表示2024年1月4日,但英国服务器的date命令默认按美式MM/DD/YYYY格式解析,误判为4月1日。
解决步骤
要让date正确识别日期,需先将输入转换为无歧义的ISO 8601格式(YYYY-MM-DD HH:MM:SS),再指定目标输出格式。
方法1:用sed转换格式后解析
# 定义输入日期 input_date="04/01/2024 16:30:00" # 将DD/MM/YYYY转换为YYYY-MM-DD iso_date=$(echo "$input_date" | sed -E 's/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/\3-\2-\1/') # 按目标格式输出,指定伦敦时区 date --date="TZ='Europe/London' $iso_date" +'%b %d %Y %H:%M:%S'
执行后输出:Jan 04 2024 16:30:00
若需要包含时区信息,将输出格式改为'%b %d %H:%M:%S %Z %Y',即可得到:Jan 04 16:30:00 BST 2024
方法2:用awk拆分重组日期
input_date="04/01/2024 16:30:00" # 拆分日期时间字段,重组为ISO格式后传给date echo "$input_date" | awk -F'[/ :]' '{printf "%d-%02d-%02d %02d:%02d:%02d", $3, $2, $1, $4, $5, $6}' | date --date="TZ='Europe/London' -" +'%b %d %Y %H:%M:%S'
原理说明
GNU date命令在解析MM/DD/YYYY和DD/MM/YYYY格式时,若日、月数值均≤12,会默认采用美式解析规则。通过转换为ISO 8601格式,可消除歧义,确保date正确识别日期的年、月、日顺序。
内容的提问来源于stack exchange,提问作者Andie
相关产品推荐
相关产品推荐

