Bash shell脚本中的YYYY-MM-DD格式日期

Bash shell脚本中的YYYY-MM-DD格式日期,bash,shell,date,strftime,Bash,Shell,Date,Strftime,我尝试在bash shell脚本中使用$(日期),但是,我希望日期采用YYYY-MM-DD格式。 如何获得此信息?您可以执行以下操作: $ date +'%Y-%m-%d' 在bash(>=4.2)中,最好使用printf的内置日期格式化程序(bash的一部分),而不是外部日期(通常是GNU日期) 因此: # put current date as yyyy-mm-dd in $date # -1 -> explicit current date, bash >=4.3 defau

我尝试在bash shell脚本中使用
$(日期)
,但是,我希望日期采用
YYYY-MM-DD
格式。

如何获得此信息?

您可以执行以下操作:

$ date +'%Y-%m-%d'
在bash(>=4.2)中,最好使用printf的内置日期格式化程序(bash的一部分),而不是外部日期(通常是GNU日期)

因此:

# put current date as yyyy-mm-dd in $date
# -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
# -2 -> start time for shell
printf -v date '%(%Y-%m-%d)T\n' -1 

# put current date as yyyy-mm-dd HH:MM:SS in $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1 

# to print directly remove -v flag, as such:
printf '%(%Y-%m-%d)T\n' -1
# -> current date printed to terminal
在bash中(尝试:
$(日期+%F)

%F
选项是
%Y-%m-%d
的别名,您正在寻找标准日期格式,因此如果您有GNU date(或比1988年更现代的任何日期命令),只需执行以下操作:
$(date-I)


输出为
2015-06-14

如果您希望年份采用两位数格式,如17,而不是2017,请执行以下操作:

DATE=`date +%d-%m-%y`
使用最新的Bash(版本≥ 4.2),您可以使用内置的
printf
和格式修饰符
%(strftime\u格式)T

printf
date
快得多,因为它是一个Bash内置命令,而
date
是一个外部命令

另外,
printf-v date…
date=$(printf…
快,因为它不需要分叉子shell

#!/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")
#date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"

echo Entered Date is $x
echo Second Date is $b
echo Third Date is $c

这里x是使用的示例日期&然后示例显示数据的格式以及比当前日期多10分钟的获取日期。

每当我有这样的任务时,我都会返回到

$ man strftime
提醒自己时间格式选项的所有可能性

$(date +%F)
输出

2018-06-20
2018-06-20_09-55-58
或者如果你也需要时间:

$(date +%F_%H-%M-%S)
可用于删除中间的冒号(:)

输出

2018-06-20
2018-06-20_09-55-58

您可以将日期设置为环境变量,以后您可以使用它

setenv DATE `date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"


我使用
$(日期+%Y-%m-%d)
$(日期+%Y-%m-%d%T)
以及时间和小时。

我使用以下公式:

TODAY=`date -I`
echo $TODAY
签出
日期的手册页
,还有许多其他有用的选项:

man date

尝试使用以下命令:

date | cut -d " " -f2-4 | tr " " "-" 


输出结果如下:
2021年2月21日

在一个月的第一天,我得到了“2012-07-1”,这不是OP所要求的。这对我很有效。手册页建议一个月的第一天是01,1号(例如2012-07-01)。日期=$(日期+%d-%m-%Y”“%H:%m:%S);我没有检查这些快捷方式的可用性,但在某些发行版中,您可以使用
+%F%t
作为
+%Y-%m-%d%H:%m:%S
的快捷方式。只需注意一些文件系统(cough**HFS)将
转换为
/
,给您一个像
2016-09-15 11/05/00
这样的字符串,这非常令人困惑。在这个千年中,任何兼容POSIX的shell中首选的语法是
date=$(date)
而不是
date=`date`
。另外,不要对私有变量使用大写;大写变量名是为系统保留的。我有一台最近的(>1988年)Mac OS X计算机,
date-I
不起作用。已使用(使用前缀“g”)安装
gdate-I
确实有效。奇怪。我找不到为GNU
date
记录的
-I
选项,尽管它确实看起来相当于
date+%F
。OSX通常是GPLv3的荒原,所以他们最近可能没有更新的date或BASH。我喜欢这个选项,因为它不需要逃逸
%
在cron中。日期手册页的内容为:%F full date;与%Y-%m-%d相同,因此这只是公认答案的一个更简洁的表示法。错误的原因有两个,很明显,这在00:00和01:00之间给出了错误的日期,而且你以
%
结束。这不是真的。应该像2019年的一个注释中的稀疏单引号一样,如果您已经在bash脚本中使用此命令,则此命令的速度*比
date
快得难以置信,因为它不必加载任何额外的库。(*我在linux服务器上测量到1000次迭代的速度差约为160倍)@timtj谢谢你指出这一点!我在答案中添加了一些关于速度的注释。我希望我可以+5作为关于
printf-v date
不分叉子shell的注释。非常好的信息!!通常我使用date,因为我还需要通过一些日期递增。printf可以做日期算术吗?@Merlin我不认为soComments必须至少是15单词长度。日期索引
date-I
就是你所需要的。我花了好几年才偶然发现。
TODAY=`date -I`
echo $TODAY
man date
date | cut -d " " -f2-4 | tr " " "-"