Python 正确格式的两个时间戳的差异
我有两张YYYYMMDDHMMSS格式的时间戳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} )
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