答案1
假设您有 GNU date(或另一个可以理解并正常工作的date
程序)并使用:-d
bash
您可以使用该-d
标志来报告不同点的时间。所以,例如
% date -d "00:00:00 tomorrow"
Sat Jul 16 00:00:00 EDT 2016
我们可以用它来报告秒数+%s
% date -d "00:00:00 tomorrow" +%s
1468641600
我们知道当前时间(以秒为单位):
% date +%s
1468633682
所以我们可以计算出差异:
% secs_left=$(( $(date -d "00:00:00 tomorrow" +%s) - $(date +%s) ))
% echo $secs_left
7871
(这大约是正确的;7871 秒是 2 小时 11 分 11 秒,这对于我运行该命令时是正确的)。
csh
根据要求编辑:
在csh
类似的命令中将是
% @ secs_left = ( `date -d "00:00:00 tomorrow" +%s` - `date +%s` )
% echo $secs_left
7871
答案2
尝试:
eval "`date +'@ s = (86400 - %S) - 60 * (%M + 60 * %H)'`"; echo $s
但请注意,在具有冬季和夏令时的时区中,如果在夏令时切换当天、切换之前(通常发生在清晨)调用,则不会给出正确的结果。
请注意,在 中csh
,算术运算符是右结合优先*/
于+-
,如
@ s = 1 - 2 + 3 - 4
是
@ s = 1 - (2 + (3 - 4))
并不是:
@ s = (((1 - 2) + 3) - 4)
与其他语言一样。这已在tcsh
(6.15.01) 中修复,您可以运行set compat_expr
以恢复到那里的旧行为。
因此周围有括号,86400 - %S
因此它适用于csh
和tcsh
。
答案3
在 csh 中,这非常简单:
set start_time = `date +%s`
set end_time = `date +%s`
@ time_elapsed = $end_time - $start_time
echo "$time_elapsed time elapsed in seconds"
@ time_elapsed = `date -u -r $time_elapsed +%T`
echo = "$time_elapsed time elapsed in hh:mm:ss format"
答案4
这读起来就像一个家庭作业问题。
鉴于您只能获得小时、分钟和秒,您将不得不获取这些数字并进行算术。算术并不复杂,我相信你能算出来。
这不会给出可靠的结果因为有一个竞争条件如果在确定这三个输入值的过程中分钟发生变化,则应采取措施检测此故障并进行纠正。
使用@StevenHaris'答案的结果来确认您的计算是否正确,