Cygwin Bash Shell借助PHP快速计算两个日期或时间的日期差、时间差

发布时间 2023-04-08 00:53:03作者: 晴云孤魂

概述

PHP有 datetime.diff工具类可以便捷地精确地计算两个日期时间之间的差值( 详见PHP官方文档:https://www.php.net/manual/zh/datetime.diff.php ),很多时候我们需要在终端通过命令参数调用的形式快速获取结果,故封装以下参数。

BTW,为什么需要借助代码和命令,而不人肉做加减法,或者自己编写计算逻辑代码?

答:时间跨度大(比如跨年),人力不方便加减,且要考虑大月(31天)、小月(30天),二月有几天(28或29)的情况,且很多时候我们不仅需要计算天数差值,还需要获取小时数,分钟数、秒数等等,故使用编程语言内部提供的差值计算函数很有必要。

Bash/Shell函数代码封装:

datediff

计算两个日期的天数之差

datetimediff

计算两个日期时间之间的差值(包含小时、时分秒等)

datediff() {
	#调用PHP代码计算日期差
	#类似PHP的 date_diff
	#See Also:https://www.php.net/manual/zh/datetime.diff.php
	#————————————————————————————————————————————————————————————
	local startDate="$1"
	local endDate="$2"
	[ -z "$endDate" ] && endDate="$(date +'%F')"   #缺少第二个参数时,终止日期默认设为今天
	
	local phpCode=$(cat <<EOF
<?php
\$origin = new DateTimeImmutable('$startDate');
\$target = new DateTimeImmutable('$endDate');
\$interval = \$origin->diff(\$target);
echo \$interval->format('%R%a days');
?>	
EOF
)
	printf "起始日期:%s\n终止日期:%s\n日期间隔:\n" "$startDate" "$endDate"
	echo "$phpCode"|php
}

datetimediff() {
	#调用PHP代码计算两个日期时间之间的差值,比datediff更细致,计算小时和分钟数
	#类似PHP的 date_diff
	#See Also:https://www.php.net/manual/zh/datetime.diff.php
	#————————————————————————————————————————————————————————————
	local startTime="$1"
	local endTime="$2"
	[ -z "$endTime" ] && IFS=$(echo -e "\n") endTime="$(date +'%F %T')"   #缺少第二个参数时,终止时间默认设为今天的此时此刻
	
	local phpCode=$(cat <<EOF
<?php
\$origin = new DateTimeImmutable('$startTime');
\$target = new DateTimeImmutable('$endTime');
\$interval = \$origin->diff(\$target);
echo \$interval->format('%R%a days %H hours %I minutes %S seconds %f microseconds');
?>	
EOF
)
	printf "起始时间:%s\n终止时间:%s\n时间间隔:\n" "$(date -d ""${startTime}"" +'%F %T')" "$(date -d ""${endTime}"" +'%F %T')"
	echo "$phpCode"|php
}

使用示例

datediff 起始日期   终止日期     #终止日期可以省略,省略时默认以今天作为终止日期
#eg:
datediff 20230303  20230405  #计算2023年3月3号到2023年4月5号相差的天数
datediff 20230303      #计算2023年3月3号到今天相差的天数

---

datetimediff 起始时间  终止时间     #终止时间可以省略,省略时默认以今天此时此刻作为终止时间
#eg:
datetimediff 20230303T12:13:35  20230405T15:23:22  #计算2023年3月3号12点13分到2023年4月5号15点23分相差的时间
datetimediff 20230303      #计算2023年3月3号0时0分0秒到此时此刻相差的时间(缺少时间信息时,默认补全为0时0分0秒)

使用效果