Bash 如何将日期格式化两次,确保它';是同一时间吗?

Bash 如何将日期格式化两次,确保它';是同一时间吗?,bash,date,Bash,Date,我有一个Bash脚本,它使用: THE_DATE=`date +"%Y-%m-%d-%H%M%S"` 以可用于mkdirnew目录的格式获取当前日期和时间 但是,对于报告生成,我使用以下方法: REPORT_DATE=`date +"%Y-%m-%d %H:%M:%S"` 这是相同的,但不同,如果你明白我的意思 这意味着运行两次date,我知道秒组件可能(尽管不太可能)在两者之间有所不同 如何同时以两种不同格式获取日期?以已知格式获取日期,然后将其传递给日期(使用-d): %s获取时间,我们

我有一个Bash脚本,它使用:

THE_DATE=`date +"%Y-%m-%d-%H%M%S"`
以可用于
mkdir
new目录的格式获取当前日期和时间

但是,对于报告生成,我使用以下方法:

REPORT_DATE=`date +"%Y-%m-%d %H:%M:%S"`
这是相同的,但不同,如果你明白我的意思

这意味着运行两次
date
,我知道秒组件可能(尽管不太可能)在两者之间有所不同


如何同时以两种不同格式获取日期?

以已知格式获取日期,然后将其传递给
日期(使用
-d
):

%s
获取时间,我们可以稍后使用它来打印特定时间,而不是当前时间。
@
前缀提供了
日期
格式提示

也许可以使用其他格式,但Unix时间似乎是最通用的,也最不容易出错


(主题外:不要使用大写变量名,使用
$()
而不是反勾号。)

您只能调用
日期一次,用换行符(或其他字符)分隔两个日期并读取它们:

IFS=$'\n' read -d '' -r the_date report_date < <(date +"%Y-%m-%d-%H%M%S%n%Y-%m-%d %H:%M:%S"; printf '\0')
所以,基本上,我的答案是只调用一次
date
,并解析其输出


作为旁注,自Bash 4.2以来,您可以使用内置的
printf
而不是外部的
日期

{ read -r the_date; read -r report_date; } < <(printf "%(%Y-%m-%d-%H%M%S%n%Y-%m-%d %H:%M:%S)T\n" -1)

{read-r the_date;read-r report_date;}<您可以获取一次日期,然后使用
sed
/
awk
或类似的方法在格式之间进行转换。在
bash
中,
日期=${report_date/:}
将更简单、更有效。但是,您在日期中缺少了额外的日和小时之间的连字符。但是,对于非主题的内容,我必须使用大写变量名-我必须按照编码标准工作。请不要争论这个问题,我不能改变它,反正我也没有时间开始辩论。@Nick我不是说你不能用大写;我是说你不应该。如果有一个编码标准,你应该遵循它,但在这种情况下也要质疑它。还有一件事,为什么我不应该使用backticks而不是$()?我使用backticks的方式已经超过30年了——它一直被认为是不好的形式吗?@Nick backticks仍然有效,但现在被大多数用户认为是不推荐的。阅读更多。
{ read -r the_date; read -r report_date; } < <(date +"%Y-%m-%d-%H%M%S%n%Y-%m-%d %H:%M:%S")
{ read -r the_date; read -r report_date; } < <(printf "%(%Y-%m-%d-%H%M%S%n%Y-%m-%d %H:%M:%S)T\n" -1)
REPORT_DATE="$(date +"%Y-%m-%d %H:%M:%S")"
# Edit: Incorrect and slow: THE_DATE="$(echo "${REPORT_DATE}" | tr -d ":")
THE_DATE="$(echo "${REPORT_DATE//:}" | tr -d " " "-")"