确定时间戳在bash中引用了多少天前
我试图以天为单位确定AWS密钥的使用年限。我在用Bash 我使用以下命令获取AWS密钥的创建日期:确定时间戳在bash中引用了多少天前,bash,amazon-web-services,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 }') 我得到的结果如下
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.
然后,我尝试用以下行报告钥匙的年龄:
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!
我做错了什么?我的日期手册页中的%j格式指的是001..366年的某一天,因此对于2004年1月4日是有意义的
你需要做一些数学运算来得到差异,有很多答案,例如,我的日期手册页中的%j格式是指001年的第366天,因此对于2004年1月4日是有意义的
你需要做一些数学运算来得到差异,有很多答案,例如,%j给出了一年中某个日期发生的天数。因此,2018年1月4日是4日,但1998年1月4日也是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."
…从今天开始运行时,会排放:
钥匙创建于2018-01-04T20:59:01Z。这把钥匙使用了188天,需要更换。
如果您只使用新版本的bash,printf-v now%%sT'-1是now=$date+%s的更有效的替代方案。%j提供了一年中发生日期的天数。因此,2018年1月4日是4日,但1998年1月4日也是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."
…从今天开始运行时,会排放:
钥匙创建于2018-01-04T20:59:01Z。这把钥匙使用了188天,需要更换。
如果您只使用新版本的bash,printf-v now“%%sT'-1比now=$date+%s更有效。date命令可能没有给出您想要的答案,但它给出了您所问问题的正确答案。%j表示朱利安天数,即从年初算起的天数。1月4日是一年中的第四天 做你想做的事情可能有几种方法。我给你一个方法让你走上正确的方向
echo "($(date +%s) - $(date -d "2018-01-04T20:59:01Z" +%s)) / 3600 / 24"|bc
%s将日期转换为从1970年1月1日起的秒数。现在我计算了秒数,然后从关键日期中减去秒数。除以3600得到小时数,再除以24得到天数。bc将数学表达式转换为值。我相信这将被截断,但您可能想尝试一下。date命令可能没有给出您想要的答案,但它给出了您所问问题的正确答案:%j表示朱利安天数,即从年初算起的天数。1月4日是一年中的第四天 做你想做的事情可能有几种方法。我给你一个方法让你走上正确的方向
echo "($(date +%s) - $(date -d "2018-01-04T20:59:01Z" +%s)) / 3600 / 24"|bc
%s将日期转换为从1970年1月1日起的秒数。现在我计算了秒数,然后从关键日期中减去秒数。除以3600得到小时数,再除以24得到天数。bc将数学表达式转换为值。我相信这会被截断,但您可能想尝试一下。我建议计算UNIX时间的差,也就是说,以秒为单位,然后除以。我建议计算UNIX时间的差,也就是说,以秒为单位,然后除以。很有趣,我结束了OP对这个问题的最后一次迭代,这个问题实际上是对这个问题的后续/澄清,与这个问题完全相同。这就是说,这实际上是一个相当好的澄清,少了不相关的内容,更多地关注他们在哪里以及如何尝试做日期数学的细节,以及它是如何出错的。有趣的是,我结束了OP对这个问题的最后一次迭代,这个问题实际上是对这个问题的后续/澄清,作为该问题的重复。这就是说,这实际上是一个很好的澄清,较少无关的内容,更多地关注他们在哪里以及如何尝试进行日期计算以及如何出错的细节。在这里使用bc与echo$$date+%s-$date-d2018-01-04T20:59:01Z+%s/3600/24相比,有什么特别的原因吗,$是进入算术上下文并扩展到表达式结果的方法。Bash有一个扩展名,因此可以运行foo=bar+baz或n>3,但这不是所有POSIX-y shell都可以移植的。如果需要POSIX-y浮点数学,则仍然需要bc,但实际上不再需要整数。ksh93具有本机浮点,但这是bash选择不采用的功能。ksh93还支持-在这里使用bc,vs,s有什么特别的原因吗
是的,echo$$date+%s-$date-d 2018-01-04T20:59:01Z+%s/3600/24?自从90年代初POSIX sh标准问世以来,它是进入算术上下文并扩展到表达式结果的一种方式。Bash有一个扩展名,因此可以运行foo=bar+baz或n>3,但这不是所有POSIX-y shell都可以移植的。如果需要POSIX-y浮点数学,则仍然需要bc,但实际上不再需要整数。ksh93具有本机浮点,但这是bash选择不采用的功能。ksh93还支持-谢谢很好的解决方案。工作完美。这是我的具体实现:timeago='90天前'key1dtSec=$date-d$user\u key1\u date+'%s'key2dtSec=$date-d$user\u key2\u date+'%s'taSec=$date-d$timeago+'%s'现在=$date+%s缓慢但更可靠的方式key1AgeDays=$$key1dtSec/60*60*24 key2AgeDays=$$key2dtSec/60*60*24谢谢!很好的解决方案。工作完美。这是我的具体实现:timeago='90天前'key1dtSec=$date-d$user\u key1\u date+'%s'key2dtSec=$date-d$user\u key2\u date+'%s'taSec=$date-d$timeago+'%s'now=$date+%s缓慢但更可靠的方式key1AgeDays=$$key1dtSec/60*60*24 key2AgeDays=$$key2dtSec/60*60*24