如何将 SSL 证书的长日期转换为短日期 | Unix KSH

Jav*_*las 5 unix datetime date converter date-formatting

我想知道是否可以将日期显示Oct 31 00:00:00 2013 GMT10-31-2013.

我得到的日期如下:

NotBeforeDate=$(openssl x509 -noout -in ${CERTIFICATE} -dates | grep "notBefore")
Run Code Online (Sandbox Code Playgroud)

我得到的日期是Oct 31 00:00:00 2013 GMT,我想将其转换为10-31-2013.

有什么命令可以做到这一点吗?还是我必须手动完成所有操作?

如果是这样,最好的方法是创建我自己的函数并将长日期作为参数发送并返回一个短日期。

小智 6

openssl 命令将使NotBeforeDate变量具有值(至少在我使用的 bash 版本中):

notBefore=Oct 31 00:00:00 2013 GMT
Run Code Online (Sandbox Code Playgroud)

因此,首先我们需要删除该notBefore=部分:

dateStr=${NotBeforeDate/notBefore=/}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用date命令:

date --date="$dateStr" --utc +"%m-%d-%Y"
Run Code Online (Sandbox Code Playgroud)

--date选项告诉命令使用该dateStr值,--utc告诉该日期是 UTC(由GMTpart指定)并将+"%m-%d-%Y"日期格式化为所需的格式。

输出是:

10-31-2013


PS:选项可能因您的 Linux 版本而异。
您可以使用date --help或来检查所有可用的man date

例如,长选项--date--utc可能不可用,但等效的短版本可能是(只是一个例子,我不确定date命令在不同的 unix 版本之间是否有这样的变化):

date -d "$dateStr" -u +"%m-%d-%Y"
Run Code Online (Sandbox Code Playgroud)

不幸的是,我没有您使用的完全相同的环境(unix 中的 ksh),但这应该可以工作。


这些 -d选项似乎是特定于 GNU 的,因此如果它不可用,您将不得不手动解析字符串。假设dateStr具有 value Oct 31 00:00:00 2013 GMT,您可以运行:

printf '%s\n' "$dateStr" | awk '{ printf "%02d-%02d-%04d\n", (index("JanFebMarAprMayJunJulAugSepOctNovDec",$1)+2)/3, $2, $4}'
Run Code Online (Sandbox Code Playgroud)

输出是:

10-31-2013