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

时间:2018-01-23 14:57:05

标签: shell unix scripting

我的日期格式如下:datetime = date +%Y%m%d%H%M%S回复它会给我类似 20180123143852 的内容。

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

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

错误输出:

   date: invalid date â20180123143852 - 2 â

有任何建议如何以我想要的格式获取

2 个答案:

答案 0 :(得分:1)

快速解决方案:

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

返回

2018-01-21

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

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

IHTH

答案 1 :(得分:0)

如果您希望两个日期之间存在差异,最好以date知道的格式转换它们。

  

man date:     --date=STRING是一种大多数免费格式的人类可读日期字符串   例如" Sun,2004年2月29日16:21:42 -0800"或" 2004-02-29 16:21:42"   甚至"下周四"。日期字符串可能包含指示的项目   日历日期,时间,时区,星期几,相对时间,   相对日期和数字。空字符串表示开头   当天日期字符串格式比容易复杂   在此处记录,但在信息文档中有详细描述。

所以我建议相应地格式化它们(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,因此不知道闰秒。