shell脚本中的日期转换和减法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本中的日期转换和减法相关的知识,希望对你有一定的参考价值。
我的日期格式如下:datetime = date +%Y%m%d%H%M%S
Echoing它给了我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脚本中的日期转换和减法的主要内容,如果未能解决你的问题,请参考以下文章
sql 日期转换代码片段 - Dato,120,konvertere