在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/}"