Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正确格式的两个时间戳的差异_Python_Shell_Unix - Fatal编程技术网

Python 正确格式的两个时间戳的差异

Python 正确格式的两个时间戳的差异,python,shell,unix,Python,Shell,Unix,我有两张YYYYMMDDHMMSS格式的时间戳 d1=20180110141907 d2=20180110141907 我想要一个shell脚本,它可以找出上面两个日期之间的差异,并将输出作为“4天22小时56分钟04秒”。如果您的时间戳是unix时间 #! /bin/bash FIRST_DATE="20180110141907" SECOND_DATE="20080100141907" TIME_DIFF=$(expr ${FIRST_DATE} - ${SECOND_DATE} )

我有两张YYYYMMDDHMMSS格式的时间戳

d1=20180110141907
d2=20180110141907

我想要一个shell脚本,它可以找出上面两个日期之间的差异,并将输出作为“4天22小时56分钟04秒”。

如果您的时间戳是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"

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

给定

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)
    }
'
Perl


这似乎很简单,你是否有一个实际的问题和你尝试过但没有成功的事情,或者你知道怎么做,只是希望其他人能为你做吗?这些邮票可能不是从纪元开始的几秒钟,它们在我看来更像yyyymmddhhmms。嗨,本杰明,感谢你的工作。但我没有得到欲望的输出。是的,输入的格式是YYYYMMDDHHMMSS
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 -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