shell脚本中的日期转换和减法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本中的日期转换和减法相关的知识,希望对你有一定的参考价值。

我的日期格式如下:datetime = date +%Y%m%d%H%M%SEchoing它给了我20180123143852之类的东西。

现在我想要从日期开始两天的差异,我正在尝试这样

dby_date=`date -d "$datetime - $date_diff " +%Y-%m-%d`

错误输出:

   date: invalid date â20180123143852 - 2 â

任何建议如何以我想要的格式获得它

答案

快速解决方案:

datetime=20180123
date -d "$datetime - $date_diff days" +%Y-%m-%d
# -----------------------------^^^^^^

回报

2018-01-21

请注意,我必须消除时间戳的时间部分,并使用-2 days进行减法。

如果您需要时间部分,我建议将其保存到单独的变量中,然后将该值附加到输出中。但是,当你改变输出格式时,我猜时间不是很重要吗?

非常紧张

另一答案

如果你想要两个日期之间的差异,最好以date知道的格式转换它们。

man date:--date=STRING是一个大多数自由格式的人类可读日期字符串,例如“Sun,2004年2月29日16:21:42 -0800”或“2004-02-29 16:21:42”或甚至“下周四”。日期字符串可以包含指示日历日期,时间,时区,星期几,相对时间,相对日期和数字的项目。空字符串表示当天的开始。日期字符串格式比这里容易记录的更复杂,但在info文档中有详细描述。

所以我建议相应地格式化它们(date "+%F %T"应该做的伎俩)

此外,日期的差异无法以日期格式转换,因此您需要进行一些手动操作。

假设你有两个日期格式为$date1$date2,差异现在可以获得:

date1="2018-01-23 16:54:16"
date2="2004-02-29 16:21:42"
# Compute difference in seconds
diff=$(( $(date --utc -d "$date1" "+%s") - $(date --utc -d "$date2" "+%s") ))
# compute the separate parts (integer arithmetic)
days=$(( diff/86400 ))
hours=$(( (diff - days*86400)/3600 ))
minutes=$(( (diff - days*86400 - hours*3600)/60 ))
seconds=$(( diff - days*86400 - hours*3600 - minutes*60 ))
# print result
printf "%0.3d days %0.2d hours %0.2d min %0.2d sec
" $days $hours $minutes $seconds

5077 days 00 hours 32 min 34 sec

或者你可以做到

date1="2018-01-23 16:54:16"
date2="2004-02-29 16:21:42"
# Compute difference in seconds
diff=$(( $(date --utc -d "$date1" "+%s") - $(date --utc -d "$date2" "+%s") ))
echo $(( $diff/86400 ))":"$(date -d @$diff "+%T")
5077:00:32:34

请记住以下内容:

  • 日期将转换为UTC的unix时间。如果两个日期都在同一时区,则不是严格要求的。
  • 计算不考虑闰秒。当发生闰秒时,将unix时间重置为1,因此不知道闰秒。

以上是关于shell脚本中的日期转换和减法的主要内容,如果未能解决你的问题,请参考以下文章

shell 脚本 片段

代码片段:Shell脚本实现重复执行和多进程

shell脚本中使用什么工具进行计算

sql 日期转换代码片段 - Dato,120,konvertere

shell脚本生成[4,9]范围内的随机整数,包含边界值4和9,并将随机数序列存放在一个数组中,脚本实现?

Shell编程-14-Shell脚本规范及调试