夏时制时间(如何获取两个日期之间的差值)
在代码中最好始终使用时间戳,并仅在输出时将时间戳转换为可读格式。如果必须处理可读日期作为输入,则需要使用可以解析它们的工具。
使用date命令举例
使用GNU date命令:
# 获取自2010年1月1日以来经过的秒数(本地时间)
then=$(date -d "2014-10-25 00:00:00" +%s)
now=$(date +%s)
echo $(($now - $then))
# 为了避免"夏时制调整"或本地时间调整,
# 最好使用协调世界时(UTC)时间:
then=$(date -u -d "2014-10-25 00:00:00" +%s)
now=$(date -u +%s)
echo $(($now - $then))
要打印超过一年的持续时间,你需要进行一些额外的数学计算。
如果纳秒级别
这个概念也可以扩展到纳秒的情况,例如:
then=$(date -u -d "2014-10-25 00:00:00" +"%s.%N")
now=$(date -u +"%s.%N")
date -u -d "2014-01-01 $now sec - $then sec" +"%j days %T.%N"
# 将会打印: 046 days 21:03:50.296901858
要将时间戳转换回可读的日期格式,可以使用最近版本的GNU date命令:
date -d "@$now"
各种shell时间操作整理
使用date命令:
- 获取当前时间戳:date +%s
- 将时间戳转换为日期:date -d @<timestamp>
使用expr命令:
- 计算时间差:expr <end_timestamp> - <start_timestamp>
示例:计算从2010年1月1日以来经过的秒数
then=$(date -d "2010-01-01 00:00:00" +%s)
now=$(date +%s)
seconds_passed=$(expr $now - $then)
echo $seconds_passed
使用date命令结合算术运算符:
- 计算时间差(秒):echo $((<end_timestamp> - <start_timestamp>))
示例:计算从2010年1月1日以来经过的秒数
then=$(date -d "2010-01-01 00:00:00" +%s)
now=$(date +%s)
seconds_passed=$((now - then))
echo $seconds_passed
使用GNU date命令提供的功能:
- 计算相对时间:date -d '<date_string> <operation> <offset> <unit>'
示例:计算某一天的前后几天的日期
# 计算三天前的日期
previous_date=$(date -d '2023-07-08 -3 days' +%F)
echo $previous_date
# 计算一周后的日期
next_week=$(date -d '2023-07-08 +1 week' +%F)
echo $next_week
最后
如果你想学习如何编写更加健壮和可靠的 Shell 脚本,减少生产环境中的错误和故障,那么关注我吧!我会分享 Shell 编程的最佳实践和建议,帮助你提高 Shell 脚本的鲁棒性和可维护性。如果你想深入了解 Shell 编程的实际应用和技巧,可以关注我的《Shell 脚本编程最佳实践》专栏,里面有我在一线互联网大厂的实际生产经验和最佳实践,帮助你高效完成各种自动化任务。