在shell脚本中格式化日期为YYYY-MM-DD格式 技术背景 在shell脚本编程中,经常需要对日期进行处理和格式化。例如,在日志记录、文件命名、定时任务等场景中,按照特定的格式获取当前日期或处理日期是非常常见的需求。YYYY-MM-DD
是一种广泛使用的日期格式,在shell脚本中实现这种格式的日期输出有多种方法。
实现步骤 bash (>=4.2) 版本 可以使用 printf
的内置日期格式化功能,printf
是bash的内置命令,比外部的 date
命令更快,且避免调用子shell带来的性能问题(在Cygwin环境中由于Windows的 fork()
调用较慢,这个问题更突出)。
1 2 3 4 5 6 7 8 9 10 printf -v date '%(%Y-%m-%d)T\n' -1printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1printf '%(%Y-%m-%d)T\n' -1
bash (<4.2) 版本 使用外部的 date
命令:
1 2 3 4 5 6 7 8 date =$(date '+%Y-%m-%d' )date =$(date '+%Y-%m-%d %H:%M:%S' )echo $(date '+%Y-%m-%d' )
其他常用格式命令 1 2 TODAY=`date -I`echo $TODAY
日期计算示例 计算给定日期后若干分钟的日期:
1 2 3 4 5 6 7 8 #!/bin/bash -e x='2018-01-18 10:00:00' a=$(date -d "$x " ) b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S" ) c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S" )echo Entered Date is $x echo Second Date is $b echo Third Date is $c
核心代码 使用 printf
格式化日期(bash >=4.2) 1 2 printf -v date '%(%Y-%m-%d)T' -1echo $date
使用 date
格式化日期(bash <4.2) 1 2 date =$(date '+%Y-%m-%d' )echo $date
最佳实践 性能考虑 :如果是bash(>=4.2),优先使用 printf
的内置日期格式化功能,因为它是bash内置命令,性能更好,且避免了子shell调用。代码可读性 :使用变量来存储格式化后的日期,提高代码的可读性和可维护性。错误处理 :在涉及日期计算和格式化的代码中,可以添加适当的错误处理逻辑,以确保脚本的健壮性。常见问题 日期格式不兼容 :不同系统或shell版本可能对日期格式有不同的支持,在使用特定格式前,最好先检查目标系统的支持情况。性能问题 :在Cygwin环境中,频繁调用外部命令 date
可能会导致性能下降,可以使用 printf
内置功能避免这个问题。子shell调用 :使用 $(...)
语法会调用子shell,可能会带来性能开销,尽量使用 printf -v
来避免。