Bash Shell日期与时间运算

Bash Shell日期与时间运算,你需要对日期和时间进行某些运算。

解决方案

如果你自己算不出结果,那就需要使用 date 命令(生成日期范围)将已有的日期和时间转换成纪元秒(日期和时间转换为纪元秒),执行相关运算,然后将得出的纪元秒转换成你需要的格式(参见纪元秒转换为日期和时间)。

如果手边没有 GNU date 命令可用,Unix Review 杂志 2005 年 9 月刊的“Shell Corner: Date-Related Shell Functions”一文中给出的 shell 函数也许能派上用场。参见生成日期范围

举例来说,假设你从某台机器上得到了一批日志数据,该机器的时钟慢了不少。大家现在应该都已经使用了网络时间协议,这种事情不大会发生,这里只是假设而已。

CORRECTION='172800'     # 两天的秒数

# 提取数据中的日期部分并保存到$bad_date
# 假设是这样:
bad_date='Jan 2 05:13:05' # syslog格式的日期

# 使用GNU date将其转换成纪元秒
bad_epoch=$(date -d "$bad_date" '+%s')

# 进行纠正
good_epoch=$(( bad_epoch + $CORRECTION ))

# 使用GNU date将纠正后的日期转换成易于阅读的格式
good_date=$(date -d "1970-01-01 UTC $good_epoch seconds")
good_date_iso=$(date -d "1970-01-01 UTC $good_epoch seconds" +'%Y-%m-%d %T')
Date

echo "bad_date:        $bad_date"
echo "bad_epoch:       $bad_epoch"
echo "Correction:      +$CORRECTION"
echo "good_epoch:      $good_epoch"
echo "good_date:       $good_date"
echo "good_date_iso:   $good_date_iso"

# 将$good_date插回日志数据

小心年份!为了易于阅读,有些 Unix 命令(如 ls 和 syslog)在某些情况下会省略年份。在计算纠正量时,可能得考虑到这一点。如果数据的日期跨度比较大或时区不同,需要想办法将其分成单独的文件,并分别进行处理。

讨论

在处理各种日期运算时,相较于我们知道的其他格式,使用纪元秒要容易得多。你不必担心小时、天、周或年。进行一些简单的加法或减法就行了。使用纪元秒也可以避免所有关于闰年和闰秒的复杂规则,如果对一个时区进行标准化(通常是 UTC,以前称为 GMT),甚至可以避开各种时区。

常用纪元时间值转换表

Bash Shell日期与时间运算

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!