Bash shell脚本中的YYYY-MM-DD格式日期
我尝试在bash shell脚本中使用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
$(日期)
,但是,我希望日期采用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
确实有效。奇怪。我找不到为GNUdate
记录的-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 " " "-"