在shell脚本中格式化日期为YYYY-MM-DD格式

在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
# 将当前日期以yyyy-mm-dd格式存入变量 $date
# -1 表示当前日期,bash >=4.3 如果不提供则默认为当前时间
# -2 表示shell的开始时间
printf -v date '%(%Y-%m-%d)T\n' -1

# 将当前日期以yyyy-mm-dd HH:MM:SS格式存入变量 $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1

# 直接打印当前日期
printf '%(%Y-%m-%d)T\n' -1

bash (<4.2) 版本

使用外部的 date 命令:

1
2
3
4
5
6
7
8
# 将当前日期以yyyy-mm-dd格式存入变量 $date
date=$(date '+%Y-%m-%d')

# 将当前日期以yyyy-mm-dd HH:MM:SS格式存入变量 $date
date=$(date '+%Y-%m-%d %H:%M:%S')

# 直接打印当前日期
echo $(date '+%Y-%m-%d')

其他常用格式命令

  • 获取ISO 8601标准日期格式:
1
2
TODAY=`date -I`
echo $TODAY
  • 获取当前日期和时间,并去掉冒号:
1
$(date +%F_%H-%M-%S)
  • dd - mm - yy 格式获取日期:
1
DATE=`date +%d-%m-%y`
  • 打印RFC - 3339格式的日期时间:
1
date +%Y-%m-%dT%H:%M:%S

日期计算示例

计算给定日期后若干分钟的日期:

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' -1
echo $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 来避免。

在shell脚本中格式化日期为YYYY-MM-DD格式
https://119291.xyz/posts/format-date-to-yyyy-mm-dd-in-shell-script/
作者
ww
发布于
2025年5月30日
许可协议