« ◆電波時計電波切り替え再送装置 | トップページ | WinとiPadのデータやり取り:メモ »

単純hh:mm:ss差分計算機



 超~!単純時刻(hh:mm:ss)差計算機

hh:mm:ss形式の差分計算機です。時分秒別にフィールドに分けて入れる必要はありません。 それでも面倒ならhh:mm:ss-hh:mm:ssと2つの時刻を1フィールドに入れても計算出来ます。

単にして純です。

 使い方

上2つのフィールドにhh:mm:ss形式のデータを入れて[計算]を押すと 差分が下のフィールドに出ます。

2つの時刻データは、ハイフンでつないで上左のフィールドにhh:mm:ss-hh:mm:ss の形で入れても構いません。
 例) 12:32:16-16:51:18
この場合、右のフィールドは無視されます。

日またぎがある場合d:hh:mm:ssの指定ができます。
 例) 23:40:11-1:00:02:15

秒だけ、分:秒だけの指定も可能です。
 例) 34:05-41:10

時間の前後は問いません。
 例) 12:32:16-16:51:18と16:51:18-12:32:16は同じ

数字の切れ目には空白があっても構いません。
 例) 12:32:16-16:51:18と 12 : 32 : 16 - 16:51:18は同じ

一桁の場合は0を入れても一桁だけ書いても構いません。
 例) 1:6:3と01:06:03は同じ

 コード。Javascriptでの整数計算法

Javascriptは型を明示することのできない極めて愚かで危険な 仕様となっています。

この計算機のコードを例に注意点を示します。

  • 単純足し算は文字列連結になる可能性があるので必ず1.0をかける等で数値あることを示す
  • 割り算の結果は整数であることを示すため必ずMath.floor()にする
  • 0フィルなどは用意されていないので自作する
<html><head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head><body>
<script type="text/javascript">
function $E(id){return document.getElementById(id);}
function $V(id){return document.getElementById(id).value;}
function zeroFill2(n){return ("0"+n).slice(-2);} // 0フィル
function parse(n){
   var d= n.split(":");
   switch( d.length ){
   case 1: return d[0]*1.0;
   case 2: return d[1]*1.0+d[0]*60;
   case 3: return d[2]*1.0+d[1]*60+d[0]*3600;
   case 4: return d[3]*1.0+d[2]*60+d[1]*3600+d[0]*86400;
      }
   return Number.NaN;
   }
function calc(){
   var d=$V("t1").split("-");
   var t1;var t2;
   if( d.length>=2 ){
      t1= parse(d[0]);
      t2= parse(d[1]);
      }
   else {
      t1= parse($V("t1"));
      t2= parse($V("t2"));
      }
   var tt=t1>t2 ? t1-t2 : t2-t1;
   var s =tt%60;
   var m =Math.floor((tt%3600)/60);
   var h =Math.floor(tt/3600);
   $E("t3").value= zeroFill2(h)+":"+zeroFill2(m)+":"+zeroFill2(s);
   }
</script>
<div style="background-color:#CCCCCC">
<input id="t1" type=text style="width:10em" value="hh:mm:ss">~
<input id="t2" type=text style="width:10em" value="hh:mm:ss"><br>
&emsp;<input type=button style="width:7em"
       value="計算" onClick="calc();"><br>
<input id="t3" type=text style="width:10em" value="(結果)">
</div>
</body></html>

かなり煩わしいやり方ですが、+する値および割り算の結果のすべてに parseInt()関数を適用するのも確実な方法の一つです。

  // var a,b,c,d,e;があるとして、それらが全て整数としたい場合
  var x=a+b/c+d/e;
  を
  var x=parseInt(a)+parseInt(parseInt(b)/parseInt(c))
                   +parseInt(parseInt(d)/parseInt(e));
  と書く
異常な書き方だと思うかもしれませんが、a=1,b=3,c=2,d=3,e=2などの場合 本来3となるべきところ、 普通にx+b/c+d/eと書くと b/c,d/eの割り算の結果が1.5となるため1+1.5+1.5=4と なってしまいます。
仮にa="1"となった場合はaは文字列扱いでa+b/c+d/eは13になります。
注意が必要なのは足し算と割り算で、ここの記述ではb,c,d,eのparseIntは不要ですが、全部に施す方が確実です。

javascriptは整数の演算が極めて難しい、特殊極まりない、不便極まりない、 危険極まりない言語であることを強く意識しておく必要があります。

ついでに書くと、varを忘れるとグローバル変数になるという全く訳の分からない 仕様となっており、名前を書き間違えるとそこで変数が定義されるという トンデモ仕様ともなっています。 変数定義が不要というとてつもなくユーザ非フレンドりな仕様 を便利だと考える仕様策定者がいることが不思議でたまりません。

補足:

javascriptでは'$'は英文字と同じ扱いを受けます。$E(),$V()は特殊な関数と いう訳ではありません。煩わしい寿限無記述を避けるため、習慣として使用 しています。
Javascriptのアンチジュゲム関数:メモ参照

|

« ◆電波時計電波切り替え再送装置 | トップページ | WinとiPadのデータやり取り:メモ »

トラックバック


この記事へのトラックバック一覧です: 単純hh:mm:ss差分計算機:

« ◆電波時計電波切り替え再送装置 | トップページ | WinとiPadのデータやり取り:メモ »