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

问题描述 投票:1回答:2

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

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

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

错误输出:

   date: invalid date â20180123143852 - 2 â

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

shell unix scripting
2个回答
1
投票

快速解决方案:

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

回报

2018-01-21

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

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

非常紧张


0
投票

如果你想要两个日期之间的差异,最好以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\n" $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,因此不知道闰秒。
© www.soinside.com 2019 - 2024. All rights reserved.