夏时制时间(如何获取两个日期之间的差值)


在代码中最好始终使用时间戳,并仅在输出时将时间戳转换为可读格式。如果必须处理可读日期作为输入,则需要使用可以解析它们的工具。

使用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 脚本编程最佳实践》专栏,里面有我在一线互联网大厂的实际生产经验和最佳实践,帮助你高效完成各种自动化任务。

声明:好星座所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,版权归原作者SuperOps所有,原文出处。若您的权利被侵害,请联系 删除。

本文链接:https://www.haoxingzuo.com/w/36112.html