【问题标题】:Difference of two time stamp in proper format正确格式的两个时间戳的差异
【发布时间】:2018-01-16 13:33:12
【问题描述】:

我有 2 个格式为 YYYYMMDDHHMMSS 的时间戳。

d1=20180110141907
d2=20180110141907

我想要一个 shell 脚本,它找出以上两个日期之间的差异,并将输出显示为“4days 22hrs 56min 04sec”。

【问题讨论】:

  • 这似乎很简单,您是否有实际问题以及您尝试过但没有奏效的事情,或者您知道该怎么做但只是希望其他人会为您做?

标签: python shell unix


【解决方案1】:

如果你的时间戳是 unix 时间

#! /bin/bash

FIRST_DATE="20180110141907"
SECOND_DATE="20080100141907" 

TIME_DIFF=$(expr ${FIRST_DATE} - ${SECOND_DATE} )

SECONDS_ON_DAY="86400"
SECONDS_ON_HOUR="3600"
SECONDS_ON_MINUTE="60"


DAYS=$(expr ${TIME_DIFF} / ${SECONDS_ON_DAY})
HOURS=$(expr ${TIME_DIFF} % ${SECONDS_ON_DAY} / ${SECONDS_ON_HOUR})
MINUTES=$(expr ${TIME_DIFF} % ${SECONDS_ON_HOUR} / ${SECONDS_ON_MINUTE})
SECONDS=$(expr ${TIME_DIFF} % ${SECONDS_ON_MINUTE})

echo ${TIME_DIFF}
echo  "${DAYS}days ${HOURS}hrs ${MINUTES}min ${SECONDS}sec"

【讨论】:

  • 邮票可能不是纪元以来的秒数,它们在我看来更像 YYYYMMDDHHMMSS。
  • 您好本杰明,感谢您的工作。但我没有得到渴望的输出。是的,输入的格式是 YYYYMMDDHHMMSS
【解决方案2】:

这并不难,但它确实需要几个步骤:解析传入的时间格式,找到以秒为单位的差异,以及计算差异的不同时间单位。

给定

d1=20180110141907
d2=20180111162211

GNU awk

gawk -v start="$d1" -v stop="$d2" '
    function str2time(time,    re, arr, t) {
        re = "([[:digit:]]{4})([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{2})"
        t = -1
        if (match(time, re, arr))
            t = mktime(arr[1] " " arr[2] " " arr[3] " " arr[4] " " arr[5] " " arr[6])
        return t
    }
    BEGIN {
        t1 = str2time(start)
        t2 = str2time(stop)
        diff = t2 - t1
        if (diff < 0) diff = -diff       #awk does not have abs()
        days  = int(diff / 86400); diff %= 86400
        hours = int(diff / 3600);  diff %= 3600
        mins  = int(diff / 60);    diff %= 60
        printf("%d days %d hours %d mins %d secs\n", days, hours, mins, diff)
    }
'
1 days 2 hours 3 mins 4 secs

Perl

perl -MTime::Piece -sE '
    $t1 = Time::Piece->strptime($start, "%Y%m%d%H%M%S");
    $t2 = Time::Piece->strptime($stop,  "%Y%m%d%H%M%S");
    $diff = abs($t2 - $t1);
    $days  = int($diff / 86400); $diff %= 86400;
    $hours = int($diff / 3600);  $diff %= 3600;
    $mins  = int($diff / 60);    $diff %= 60;
    printf "%d days %d hours %d mins %d secs\n", $days, $hours, $mins, $diff;
' -- -start="$d1" -stop="$d2"
1 days 2 hours 3 mins 4 secs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多