1. 概要(Purpose / Scope)
本ページでは、時間電卓の計算仕様(アルゴリズム・丸め・差分)と検証方法を公開します。対象は「残業」「勤務時間」「タイムシート」「丸め」「時刻差分」「小数時間変換」です。時間表記は H
・H:MM
・H:MM:SS
を基本とし、単位は H(時間)・M(分)・S(秒)・D(日)を扱います。
2. 入力仕様(Input Specification)
- 受入形式:
H
/H:MM
/H:MM:SS
(MM
・SS
は 0–59)。 - 許容記号:先頭の
+
/-
(休憩・差引に利用)。 - 入力補正:全角の
:+-,
は半角へ自動変換。 - 無効値:分秒が60以上、空文字、非数、桁上限超過はエラー。
- 注意:小数時間の直接入力は将来対応(現状は H:MM:SS へ変換して入力)。
3. 正規化と内部表現(Normalization)
内部演算はすべて整数の秒で行い、浮動小数点誤差を回避します。
// 擬似コード:H:MM:SS → 秒
function parseHmsToSeconds(s):
t = normalizeToHalfWidth(s).trim()
sign = (+1 or -1) // 先頭の +/- (省略時 +1)
[H, M, S] = coerceParts(t) // 欠損は 0 で補完
assert 0 <= M < 60 and 0 <= S < 60
return sign * (H*3600 + M*60 + S)
注:演算(加減算)→単位変換→表示の順で処理します(詳細は「4. 演算の順序」)。
4. 演算の順序(Order of Operations)
- デフォルト:加算・減算の合計 → 単位変換 → 表示。
- 残業系では、必要に応じて順序を選択可能:
差分 → 丸め → 集計
/丸め → 差分 → 集計
。 - 丸めの適用順序により結果が変化するため、透明性の観点から明示します。
入力(実働) | 所定 | 丸め設定 | 差分→丸め→集計 | 丸め→差分→集計 |
---|---|---|---|---|
8:07 | 8:00 | 15分・切上げ | 差分 0:07 → 丸め 0:15 | 実働 8:15 → 差分 0:15 |
7:53 | 8:00 | 15分・切捨て | 差分 -0:07 → 丸め 0:00 | 実働 7:45 → 差分 -0:15 |
5. 丸めルール(Rounding)
- 方式:切上げ(ceil)/切捨て(floor)/四捨五入(half-up)。
- 単位:5 / 10 / 15 / 30 / 60 分など。
- 適用ポイント:日次の実働/残業差分/合計(週・月)。
- 表示用の小数時間は
(sec / 3600).toFixed(2)
(演算結果の表示のみ)。
// 擬似コード:分単位の丸め
function roundByMinutes(sec, unitMin, mode):
unitSec = unitMin * 60
q = sec / unitSec
if mode == 'ceil' return ceil(q) * unitSec
if mode == 'floor' return floor(q) * unitSec
if mode == 'half' return round(q) * unitSec // 四捨五入(half-up)
6. 時刻差分(勤務時間の算出)
- 基本式:
実働 = 退勤 - 出勤 - 休憩
。 - 翌日またぎ:
end < start
の場合はend += 24h
。 - 深夜帯(任意):例 22:00–5:00 をセグメント分割して集計(ユーザー設定)。
- 休憩の自動控除:条件式(例:実働6h超で45分、8h超で60分)を適用可能。
7. 残業の算出(差分の定義)
- 基本式:
残業 = 実働 - 所定
(負値の扱いは 0 固定 or マイナス表示を設定可能)。 - 集計:各日の残業を日/週/月で合算。
- 区分ラベル:法定内/外、深夜・休日などは規程依存のためユーザー設定。
注意:労務・給与の最終判断は各組織の就業規則に従ってください。詳細は 免責事項 をご参照ください。
8. 単位変換と表示(Output)
- 形式:H:MM:SS/H(小数)/M/S/D。
- 小数時間:内部は整数秒、表示時のみ小数第2位で丸め。
- 符号:負値は先頭に
-
を付与。
9. エラーハンドリング
- 代表エラー:形式不正、
MM/SS >= 60
、空入力、超大値、非数。 - エラーメッセージは日本語で具体例を提示(例:「入力形式: H / H:MM / H:MM:SS」)。
- 通知:エラーは
role="alert"
、結果はaria-live="polite"
。
10. 性能・安全性
- 計算量:O(n)(n=入力件数)。
- 安全整数:極端に大きな合計秒は
Number.MAX_SAFE_INTEGER
を超えない範囲で制御。 - クライアントサイドのみで処理(外部送信なし)。
11. データ保存とプライバシー
- 保存:ブラウザの
localStorage
に履歴・単位・テーマ・一部設定を保存。 - 送信:計算データはサーバーへ送信しません。
- 削除:UIの「履歴クリア」等でいつでも削除可能。詳細は プライバシー を参照。
12. 品質保証(Testing Methodology)
- ユニットテスト:正常系(H/H:MM/H:MM:SS、負値、翌日またぎ)、異常系(60以上、非数、超大値、空)。
- プロパティベース:HMS→秒→HMS が恒等、加算の結合法則。
- ゴールデンテスト:公開テストケースの固定化(表形式)。
- 丸めの回帰:丸め順序の変更差分を固定化し、比較検証。
- アクセシビリティ:キーボードのみ、スクリーンリーダー、コントラスト(方針 参照)。
- ブラウザ互換:Windows/macOS/iOS/Android + Chrome/Firefox/Safari。
代表テストケース(例)
ID | 入力 | 設定 | 期待出力 |
---|---|---|---|
T-001 | 8:00 + 0:45 − 1:00 | 単位=H:MM:SS | 7:45 |
T-002 | 出勤 23:00 / 退勤 07:00 / 休憩 1:00 | 翌日またぎ | 7:00 |
T-003 | 実働 8:07 / 所定 8:00 | 丸め=15分・切上げ | 差分→丸め=0:15 |
13. 既知の制約・限界
- 小数時間の直接入力は未対応(今後対応予定)。
- 広告iframeのフォーカス順は提供元仕様に依存。
- 労務規程(区分・割増率)は組織ごとに異なるため、当サイトでは決め打ちを行いません。
14. 再現手順(Reproducibility)
本ページの仕様は公開テストケースで再現可能です。将来的にテスト用のCSV(入力→期待出力)を配布し、誰でも検証できる形を提供します。
// 簡易サンプル:往復変換の恒等性
assert formatHMS(parseHmsToSeconds("2:30:15")) == "2:30:15"
15. 変更履歴
- v1(初版)— 本ページを公開し、丸め順序の比較表を追加。
16. 参考資料
- WAI-ARIA / WCAG(JIS X 8341-3:2016 相当)
- ISO 8601(時間表記の考え方)
- IEEE 754(浮動小数点の取り扱い注意点)
- 当サイトの アクセシビリティ方針・プライバシー・免責事項