shell - unix 中基于 yyymm 的日期差异

标签 shell unix

#####DATE1=201609
#### DATE2=201508

如何计算这两个日期之间的差异并将输出作为月份的计数
IE
201609-201508=13month

最佳答案

时差的计算通常是一项复杂的任务,即使对于单一日历类型(并且有 many )。许多编程语言都内置了对日期和时间操作操作的支持,包括计算时差。但流行的 shell 中最有用的功能是 date 不幸的是,缺少此功能的命令。

因此,我们应该是否用另一种语言编写脚本,或者做一些假设,例如一年中的天数。

例如,在 Perl 中,只需四行代码即可完成任务:

perl -e $(cat <<'PerlScript'
use Time::Piece;
my $t1 = Time::Piece->strptime($ARGV[0], '%Y%m');
my $t2 = Time::Piece->strptime($ARGV[1], '%Y%m');
printf "%d months\n", ($t1 - $t2)->months;
PerlScript
) 201609 201508

但是,Time::Piece的区别对象是 Time::Seconds 的一个实例这实际上假设

there are 24 hours in a day, 7 days in a week, 365.24225 days in a year and 12 months in a year.



这间接证实了我关于任务复杂性的话。

那么让我们做同样的假设,并编写一个简单的shell脚本:
DATE1=201609
DATE2=201508

printf '(%d - %d) / 2629744.2\n' \
  $(date -d ${DATE1}01 +%s) \
  $(date -d ${DATE2}01 +%s) | bc

哪里2629744.2是一个月的秒数,即 3600 * 24 * (365.24225 / 12) .

请注意,大多数 shell 不支持浮点运算。这就是为什么我们需要调用外部工具,例如bc .

脚本输出 13 .这是便携版。例如,您可以在标准 shell、Bash、Korn shell 或 Zsh 中运行它。如果要将结果放入变量中,只需将 printf 包裹起来即可$( ... ) 中的命令:
months=$(printf '(%d - %d) / 2629744.2\n' \
  $(date -d ${DATE1}01 +%s) \
  $(date -d ${DATE2}01 +%s) | bc)

printf '%d - %d = %d months\n' $DATE1 $DATE2 $months

关于shell - unix 中基于 yyymm 的日期差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40573836/

相关文章:

java - 每次获取 shell 脚本 255 的退出值

linux - 如何在 bash 中按文件扩展名和大小对目录进行排序

regex - 如何使用 vi 删除文本文件中每行的前 5 个字符?

c - 资源暂时不可用 - MSG_DONTWAIT 标志

linux - 当要求用户在 Bash 中输入三个文件名时如何显示最新的文件

linux - 检查 Linux 上任何事件的 screen session

java - 来自 AWT JFrame 的真正应用程序模态 SWT shell

bash - 可以对 Bash shell 变量执行的操作

bash - 循环 grep 函数

python - 如何在 Linux 上使用 Python 检查进程是否仍在运行?