使用一个日期变量,但以不同的方式格式化它

使用一个日期变量,但以不同的方式格式化它

在shell脚本中,有以下变量:
datestamp=$(date '+%Y-%m-%d_T%H-%M-%S')
datestamp_pretty=$(date '+%m/%d/%Y at %I:%M:%S %p')

第一个用作输出文件名的一部分,而第二个用于在文件内容中显示易于阅读的日期和时间。由于它们是单独创建的,因此秒数可能会略有偏差。有没有办法创建单个日期变量,然后以两种不同的方式格式化它?如果是这样,这是如何完成的?

答案1

如果您使用 GNU,这非常简单date

首先,从 获取最通用的时间格式date。我选择获取纪元时间:

epoch=$(date +%s)

然后,将纪元转换为您想要的任何格式,无论您想要多少次:

datestamp=$(date -d @$epoch '+%Y-%m-%d_T%H-%M-%S')
datestamp_pretty=$(date -d @$epoch '+%m/%d/%Y at %I:%M:%S %p')

它应该始终代表您第一次捕获的时间$epoch

如果您没有 GNU date,您将需要一些其他方法将纪元转换为人类日期。

答案2

这是一种不需要 GNUdate 并且不需要您运行date多次的方法。

选择一个永远不会出现在任何日期/时间字符串中的字符串。它可以是单个字符 - 例如,~^都 |可以。但我会用 来演示 /foo/

只需将日期字符串格式与您选择的字符串连接起来即可。 (从第二种格式中删除 +。)将输出捕获到date变量中,然后在分隔符字符串处将其拆分:

combined=$(date '+%Y-%m-%d_T%H-%M-%S/foo/%m/%d/%Y at %I:%M:%S %p')
datestamp="${combined%/foo/*}"
datestamp_pretty="${combined#*/foo/}"

相关内容