将秒转换为天时分秒

时间:2018-07-23 07:36:54

标签: bash time sh

执行我的代码的以下部分时,出现错误:语法错误:预期的操作数(错误令牌为“ /(60 * 60 * 24)”)

# \function  convertsecs2dhms
# \brief     convert seconds to days hour min sec
#####################################################################################################################

function convertsecs2dhms()
{
    ((d=${1}/(60*60*24)))
    ((h=(${1}%(60*60*24))/(60*60)))
    ((m=(${1}%(60*60))/60))
    ((s=${1}%60))
     printValue=`printf "%02d days %02d hours %02d minutes %02d seconds \n" $d $h $m $s`
     printInfo "$printValue"
}

这是我得到的错误:

(standard_in) 1: syntax error
expr: syntax error
Estimated time for migration completion for server:-
./migration.sh: line 983: ((: d=/(60*60*24): syntax error: operand expected (error token is "/(60*60*24)")
./migration.sh: line 984: ((: h=(%(60*60*24))/(60*60): syntax error: operand expected (error token is "%(60*60*24))/(60*60)")
./migration.sh: line 985: ((: m=(%(60*60))/60: syntax error: operand expected (error token is "%(60*60))/60")
./migration.sh: line 986: ((: s=%60: syntax error: operand expected (error token is "%60")
00 days 00 hours 00 minutes 00 seconds

2 个答案:

答案 0 :(得分:4)

仅用双括号不足以在纯sh中选择算术上下文。

# don't use non-portable "function" keyword
convertsecs2dhms () {
    # use $((...)) for arithmetic
    d=$((${1}/(60*60*24)))
    h=$(((${1}%(60*60*24))/(60*60)))
    m=$(((${1}%(60*60))/60))
    s=$((${1}%60))
    # use printf -v
    printf -v printValue "%02d days %02d hours %02d minutes %02d seconds \n" $d $h $m $s
    printInfo "$printValue"
}

另请参阅https://mywiki.wooledge.org/ArithmeticExpression,但请注意,其中大多数描述的是Bash,而不是POSIX sh

答案 1 :(得分:0)

这不能回答您为什么有这些错误的问题。答案由tripleee给出。这个答案为您提供了另一种实现目标的方法。

您可能感兴趣的是使用date命令

convertsec2dhms () {
   date -d "@$1" "+$(($1/86400)) days and %H hours %M minutes %S seconds";
}

要获得天数,我们将整数除以86400秒。假设日期是以UNIX时间(即从1970-01-01T00:00:00开始的秒数)给出的,则可以通过date命令获得小时,分钟和秒。

注意:您不能使用每年的天计算(%j),因为这总是会给您额外的一天(1月1日是第1天而不是第0天)。

$ convertsec2dhms 69854632
808 days and 12 hours 03 minutes 52 seconds