フランス拠点の監査ログを日次で集計するスクリプトがあり、対象は1日あたり約40万行、保存はUTC、表示は現地時刻という構成でした。ところが現地の運用担当が手で追記する障害メモだけが「12/03/2024 14:05」のような形式で、しかも日と月が逆のことがあり、集計時に3月12日と12月3日が混ざる現象が出ていました。
まず追記側の書式を固定しました。メモのテンプレートに日付欄を設け、入力はISO 8601拡張形式に限定します。
2024-03-12T14:05:00+01:00
変換は既存分を一括で直すのではなく、パースに失敗した行だけ別ファイルに退避し、そこだけ人手で確認する形にしました。パースにはPythonのdatetime.fromisoformatを使い、タイムゾーンが付いていない行はエラーとして弾きます。
from datetime import datetime
def parse_memo(ts: str) -> datetime:
dt = datetime.fromisoformat(ts)
if dt.tzinfo is None:
raise ValueError(f"tz missing: {ts}")
return dt.astimezone(timezone.utc)
なぜ保存をUTCに寄せたかというと、夏時間の切り替えで同じ現地時刻が二回現れる時間帯があり、現地時刻のまま並べると障害の前後関係が逆転するためです。代わりに、表示のたびに変換コストがかかり、現地の担当者がメモを見た瞬間には時刻がずれて見えるという代償があります。
この方法が効かないのは、外部ベンダーから届くCSVのように書式をこちらで制御できない入力です。実際、日付欄が「03/12/2024」で固定のファイルがあり、これは月日の順序を機械的に判断できません。ファイル単位で書式を宣言する設定を別に持たせて対処しましたが、宣言を間違えると静かに誤変換されます。
現地のメモをISO 8601に統一した運用を続けている方で、入力ミスをどこで検出しているか、教えてもらえると助かります。
0
赞同度 100% · 0 条评论 · 3 阅读
0 条评论
还没有评论,写下第一条。