Guide
無効なタイムスタンプ: 迅速な診断と修正
簡単な診断チェックリスト
- 長さを確認します: 10=秒、13=ミリ秒、16=μ秒、19=ナノ秒。
- 数字をチェック: 数字のみ。スペース/文字を削除します。
- 範囲を確認してください: 結果の日付は妥当であり、64 ビットは安全ですか?
- タイムゾーン をチェックします。まず UTC で変換してから、ターゲット オフセットを適用します。
- DST エッジ をチェックします。ローカライズする場合は、IANA ゾーン (
America/New_York) を使用します。
今すぐ確認する必要がありますか? Unix タイムスタンプ コンバータ または バッチ コンバータ にジャンプします。
一般的なエラーの種類
- 長さの不一致: 13 桁が秒として扱われる → 遠い未来の日付。
- 数字以外の文字: 隠しスペース、カンマ、または文字。
- 範囲外: 2038 を超えると 32 ビット秒がオーバーフローします。一部のシステムではネガはサポートされていません。
- タイムゾーンの曖昧さ: サーバーの現地時間と予想される UTC。
- DST のシフト: 欠落している時間に現地時間に解析すると失敗します。
検証手順 (コピー&ペースト)
// JavaScript: validate & normalize to milliseconds
export function normalizeEpoch(raw) {
const trimmed = raw.trim();
if (!/^[0-9]+$/.test(trimmed)) throw new Error("Digits only");
const len = trimmed.length;
if (len === 10) return Number(trimmed) * 1000;
if (len === 13) return Number(trimmed);
if (len === 16) return Number(trimmed) / 1000;
if (len === 19) return Number(trimmed) / 1_000_000;
throw new Error("Invalid length");
}
# Python: validate & to datetime (UTC)
from datetime import datetime, timezone
def parse_epoch(raw: str) -> datetime:
if not raw.isdigit():
raise ValueError("Digits only")
n = len(raw)
if n == 10:
ts = int(raw)
elif n == 13:
ts = int(raw) / 1000
elif n == 16:
ts = int(raw) / 1_000_000
elif n == 19:
ts = int(raw) / 1_000_000_000
else:
raise ValueError("Invalid length")
return datetime.fromtimestamp(ts, tz=timezone.utc)
-- SQL (PostgreSQL): validate timestamp length in a table
SELECT id, ts_raw,
CASE
WHEN ts_raw ~ '^[0-9]{10}$' THEN 'seconds'
WHEN ts_raw ~ '^[0-9]{13}$' THEN 'milliseconds'
WHEN ts_raw ~ '^[0-9]{16}$' THEN 'microseconds'
WHEN ts_raw ~ '^[0-9]{19}$' THEN 'nanoseconds'
ELSE 'invalid'
END AS ts_precision
FROM events
WHERE ts_raw !~ '^[0-9]{10}$'
OR ts_raw::numeric > 32503680000; -- > 3000-01-01 as a sanity bound
テンプレートを修正する
- 精度修正: 長さを検出 → ミリ秒にスケール → 解析を再実行。
- トリミング/サニタイズ: 正規表現検証の前に空白とカンマを削除します。
- 範囲ガード: 妥当な範囲外の値を制限または破棄します (例: 年
< 2000または> 2100)。 - タイムゾーン修正: UTC として解析し、ユーザーのターゲット オフセット/ゾーンにフォーマットします。
- DST セーフな解析: UTC を優先します。ローカルが必要な場合は、IANA ゾーン ライブラリを使用します。
よくある質問
- 最も安全なデフォルトは何ですか? UTC として解析し、要求されたタイムゾーンにフォーマットします。
- 2038 問題を防ぐにはどうすればよいですか? 64 ビット整数として保存します。 32 ビット秒ベースのストレージは避けてください。
- データをバッチでクリーンアップするにはどうすればよいですか? 正規表現プレフィルター + 長さに基づくスケーリングを使用して、コンバーターにパイプします。 バッチ タイムスタンプ コンバータ を試してください。