Cygwin、Linux Bash计算某个时刻偏移一定时间长度后的时间通用函数:datetimecount

stevehe 2023年07月14日 111次浏览

datetimecount 函数代码

datetimecount() {
	#计算某个日期时间偏移一定时间长度后的时刻(目前主要供录制IPTV直播源时计算视频时长使用)
	# $1-->偏移量:符合date命令的描述参数即可,也支持传递标准时间格式:eg: +01:23:35 (标记符号(加减号)可省略,小时字段可省略)
	# $2-->要计算偏移时间基点:可省略(缺省时以当前时刻为偏移的基点)
	local moveTime="$1"
	local baseTime="$2"
	if [[ "${moveTime}" =~ ^([-+] ?)?([0-9]{1,2}:)?[0-9]{1,2}:[0-9]{1,2}$ ]];then
		#echo "格式需要转换!"
		local moveTime=$(echo "$moveTime"|sed -r 's/^(\+|\-)/\1 /'|tr -s ' ')  #始终保证+号或-号后有一个空格;
		local convertCode=$(echo "$moveTime"|awk -F '[: ]' '{
			flag="";
			if($1=="-" || $1=="+"){
				flag=$1;
				sub($1,"");
			}
			seconds=$NF;
			if($(NF-1)) minutes=$(NF-1);
			if(NF-2>0) hours=$(NF-2);
			/** 判断&拼装 **/
			if(hours) hours=sprintf("%s%s hours ",flag,hours);
			if(minutes!="") minutes=sprintf("%s%s minutes ",flag,minutes);
			if(seconds!="") seconds=sprintf("%s%s seconds",flag,seconds);
			/* printf "%s %s %s %s\n",flag,hours,minutes,seconds; */
			printf "local moveTime=\"%s %s%s%s\"\n",flag,hours,minutes,seconds;
		}')
		eval "$convertCode"
		#echo "moveTime =>: $moveTime"
	fi
	column -t -R 1 -s ":" -o ":"<<<$(
		printf "时间基点:%s\n" "$(date -d "$baseTime" +'%F %T')"
		date -d "${moveTime} ${baseTime}" +'偏移后的时间格式化:%F %T'$'\n''偏移后的时间戳:@%s'
	)
}

使用方法:

datetimecount 偏移量 [要偏移的时间基点]
注:时间基点可以省略,缺省时以当前时刻作为时间基点

使用示例:

# 计算 12:30 前进 19分21秒 秒后的时间
datetimecount 19:21  12:30
或
datetimecount 19:21  12:30   #+号表示时间向前推移,-号表示时间倒退,默认为+号时可省略
---
# 计算 12:30 倒退 18分40秒 后的时间
datetimecount -18:40 12:30
---
# 另:支持指定 date 命令支持的日期时间描述类字符串
eg:
datetimecount '-18 mins -40 seconds' 12:30

操作截图

image.png
image.png