如何在 bash 下获取两个日期之间的差值[重复]
- 2024-11-14 08:29:00
- admin 原创
- 17
问题描述:
正如问题所言。我想从 20120203 中减去 20120115,得到 19 作为答案。在 shell 脚本中实现此操作的最佳方法是什么?
解决方案 1:
let DIFF=(`date +%s -d 20120203`-`date +%s -d 20120115`)/86400
echo $DIFF
解决方案 2:
建议采用以下解决方案bc
:
current="$(date +%s.%N)" #current date, precise to nanoseconds
old="$(date +%s.%N -d `sh some_script_that_gives_a_date.sh`)" #convert output to ns too
diff=$(echo "$current-$old" |bc)
date +%s.%N -d $1
接受任意日期并将其转换为给定格式 (如本例中+%s.%N
为float
秒数)。请注意
-d 不是 POSIX 日期的一部分。[但是]只要[你]不在 Solaris 之类的发行版上工作([OP] 将其标记为 linux 而不是 unix),[你] 应该没问题。:)
( Jaypal Singh对此答案的评论)
要将其转换回人类可读的形式,您可以使用:
date $2 -d @0$diff #Pad diff with leading zero
$2
日期格式又在哪里请参见此处的示例
解决方案 3:
可以在脚本中使用的快速且完全肮脏的修复方法(快速且快捷):
此函数gendates
以 YYYYmmdd 格式(最早日期在前)生成两个日期之间的有效日期列表。
function gendates { for dd in $(seq -w $1 $2) ; do date -d $dd +%Y%m%d 2>/dev/null ; done ; }
我使用这个函数来实现与日志文件相关的几个目的,比如生成要检查的日志文件名列表 [1]。它还可以方便地计算天数差异:
echo "$(gendates YYYYmmdd YYYYmmdd)" | wc -l
YYYYmmdd 当然必须是日期。它只在 $1 早于 $2 时才有效,并且对于较大的日期差异,它很慢,但对于几年的时间段以及用于临时脚本,它非常方便。
如果你碰巧安装了 MySQl 或者类似软件,那么有一个非常快捷的选择:
mysql -BNe "SELECT DATEDIFF($1,$2) AS DiffDate ;" | tr -d -
最后一个tr
允许您以任何顺序输入日期(如果第一个日期早于第二个日期,则 MySQL 将显示“-”)。
[1] 生成日期列表的原因是,这样我就可以生成以下格式的日志文件的名称:YYYYmmdd.log.gz。我可以使用星号或 $(ls) 来实现这一点,但这比仅提供带有字符串的列表要慢得多。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD