Normalize Timezone
normalize_timezone · dates · date, text
2026-09-23
กำลังประมวลผล…
normalize_timezone · dates · date, text
2026-09-23
ระบบส่วนใหญ่บันทึกเวลาเป็น UTC แต่รายงานที่คนไทยอ่านต้องเป็นเวลาไทย ถ้าแปลงผิดหรือลืมแปลง ยอดขายของวันหนึ่งจะเลื่อนไปอีกวัน โดยเฉพาะรายการช่วงหัวค่ำซึ่งข้ามวันพอดี เทคนิคนี้ย้ายเวลาให้ถูกต้องและแสดงผลในรูปแบบเดียวกันทั้งคอลัมน์
normalize_date ก่อนonError+09:00 จะใช้ offset นั้นเป็นหลัก ไม่ใช่ค่าใน fromYYYY-MM-DDTHH:mm:ss ของโซนปลายทาง เปิด withOffset ได้ถ้าต้องการให้ติด offset ไปด้วย| Parameter | Type | Default |
|---|---|---|
column | string | — |
from | string | "UTC" |
to | string | "Asia/Bangkok" |
withOffset | boolean | false |
onError | keep | null | "keep" |
import json
import re
from datetime import datetime, timedelta, timezone
ISO = re.compile(r'^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}):(\d{2})(?::(\d{2}))?)?(Z|[+-]\d{2}:\d{2})?$')
def normalize_timezone(value, from_offset=0, to_offset=7):
if not isinstance(value, str):
return value
found = ISO.match(value.strip())
if not found:
return value
year, month, day, hour, minute, second, zone = found.groups()
moment = datetime(int(year), int(month), int(day), int(hour or 0), int(minute or 0), int(second or 0), tzinfo=timezone.utc)
if zone and zone != 'Z':
sign = -1 if zone[0] == '-' else 1
moment -= timedelta(minutes=sign * (int(zone[1:3]) * 60 + int(zone[4:6])))
else:
moment -= timedelta(hours=from_offset)
return (moment + timedelta(hours=to_offset)).strftime('%Y-%m-%dT%H:%M:%S')
values = ['2026-09-23T18:30:00', '2026-09-23', '2026-09-23T18:30:00+09:00', 'เมื่อวาน', None]
print(json.dumps([normalize_timezone(v) for v in values], ensure_ascii=False))
คอลัมน์ created_at จากระบบหลังบ้านเป็น UTC ตั้ง from เป็น UTC และ to เป็น Asia/Bangkok ตรวจ Preview ที่แถวซึ่งเวลาเดิมอยู่หลัง 17:00 ว่าวันที่ขยับไปอีกวันตามที่ควรเป็น จากนั้นใช้ extract_date_parts เพื่อดึงวันและเดือนสำหรับสรุปรายงาน
ใช้ normalize_date ก่อนเมื่อค่ายังไม่เป็น ISO ใช้ extract_date_parts เพื่อแยกส่วนของวันที่หลังย้ายโซนแล้ว และใช้ validate_date_range เพื่อตรวจว่าค่าอยู่ในช่วงที่คาดหวัง