概述
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秒)