./script.csh 05:25:00 02:30:50
数分以内に出力を返す必要があります。
シリーズを再帰的に繰り返しているので、値を新しい新しい値とどのように比較しますか? | bcはcshで動作しますか?
答え1
完全比較の場合:
perl -e 'for(@ARGV){s/(..):(..):(..)/$1*3600+$2*60+$3/e} $_=(shift)-(shift); printf"%02d:%02d:%02d\n",$_/3600,$_/60%60,$_%60' 05:25:00 02:30:50
分単位の差:
perl -e 'for(@ARGV){s/(..):(..):(..)/$1*3600+$2*60+$3/e} $_=(shift)-(shift); printf"%d\n",$_/60' 05:25:00 02:30:50
bashでも動作します。
答え2
2つの日付を連続した日付として希望するのか、どちらが同じ日であり、どの順序でも可能であると仮定するのかは不明です。
timediff 23:00:00 01:00:00
この回答では、2時間= 120分を返す必要がある最初の回答を想定しています。
22時間= 79200分を返す必要があるかどうか@ s = 86400 + $s
に変更します。@ s = - $s
alias timediff 'set t=(\!:*:gs/:/ * 3600 + /:gs/:/ * 60 + /:q);\\
@ s = ($t[2]) - ($t[1]); if($s < 0) @ s = 86400 + $s;\\
@ m = $s / 60;\\
@ H = $s / 3600 M = $s % 3600 / 60 S = $s % 60;\\
echo seconds=$s minutes=$m hours=$H\:$M\:$S'
timediff 05:25:00 02:30:50
seconds=75950 minutes=1265 hours=21:5:50
スクリプトとして:
set t=($argv:gs/:/ * 3600 + /:gs/:/ * 60 + /:q)
@ s = ($t[2]) - ($t[1]); if($s < 0) @ s = 86400 + $s
@ m = $s / 60
@ H = $s / 3600 M = $s % 3600 / 60 S = $s % 60
echo seconds=$s minutes=$m hours=$H\:$M\:$S