确定时间戳在bash中引用了多少天

时间:2018-07-11 21:38:11

标签: bash amazon-web-services

我正在尝试确定几天内AWS密钥的使用期限。我正在使用Bash。

我使用以下命令获取AWS密钥的创建日期:

 user_key1_date=$(aws iam list-access-keys --user-name "$aws_user_name" --profile "$aws_key" --output text --query 'AccessKeyMetadata[*].[AccessKeyId,CreateDate]' | awk 'NR==1 { print $2 }')

我得到这样的结果:

2018-01-04T20:59:01Z

然后,我试图以天为单位获取密钥的使用期限,并将其分配给以下行中的变量:

key1Age=$(date -d "$user_key1_date" +%j)

然后我尝试通过以下这一行报告密钥的使用期限:

The AWS access key: $user_access_key1 for user name: $aws_user_name was created on $date1. This key is $key1Age days old and needs to be replaced.

但是被报告的密钥的年龄是未知的:

Key AKIAIPSNLEFKBLH2CLOQ is 004 days old. Time to change your key!

我在做什么错了?

3 个答案:

答案 0 :(得分:2)

%j为您提供一年中发生日期的天数。因此,2018年1月4日为4,1998年1月4日也是如此;当您需要进行可以跨越年份界限的比较时,它没有用。

请考虑以下类似内容:

now=$(date +%s) # slow but more reliable way
key1Date=2018-01-04T20:59:01Z
key1TimeSeconds=$(date -d "$key1Date" +%s)
key1AgeSeconds=$(( now - key1TimeSeconds ))
key1AgeDays=$(( key1AgeSeconds / (60 * 60 * 24) ))
echo "Key created on $key1Date. This key is $key1AgeDays days old and needs to be replaced."

...运行时(从今天开始)发出:

Key created on 2018-01-04T20:59:01Z. This key is 188 days old and needs to be replaced.

如果您仅使用bash的新版本,则printf -v now '%(%s)T' -1now=$(date +%s)的更有效替代。

答案 1 :(得分:2)

date命令可能没有给出您想要的答案,但是它为您提出的问题提供了正确的答案。 :)%j给出儒略日,或从年初开始的天数。 1月4日是一年中的第4天。

可能有几种方法可以做您想要的事情。我会给您一种方法,使您朝正确的方向前进。

echo "($(date +%s) - $(date -d "2018-01-04T20:59:01Z" +%s)) / 3600 / 24"|bc

%s将日期转换为从1970年1月1日起的秒数。在这里,我现在采用秒数,并从关键日期中减去秒数。除以3600可得到小时数,然后除以24可得到天数。 bc将数学表达式转换为值。我相信这会被截断,但是您可能想尝试一下。

答案 2 :(得分:0)

我的%j手册页中的date格式是指day of year (001..366),因此对于1月4日而言,004是有意义的。

您需要做一些数学运算才能得出差异,为此,有很多答案,例如How to find the difference in days between two dates?