DateTime ใน JavaScript และ Python มีความแตกต่างสำคัญ 2 จุดที่ต้องระวังเมื่อส่งข้อมูลข้ามภาษา
1. ความแตกต่างของเดือน (Month Index)
JavaScript: เดือน 0-11 (มกราคม = 0, ธันวาคม = 11)
Python: เดือน 1-12 (มกราคม = 1, ธันวาคม = 12)
// JavaScript new Date(2017, 11, 1) // 1 ธันวาคม 2017 (เดือน 11 = ธันวาคม) # Python datetime(2017, 11, 1) # 1 พฤศจิกายน 2017 (เดือน 11 = พฤศจิกายน)
ตัวอย่างจากบทความ: (2017, 11, 1) → Python: 1 พฤศจิกายน 2017 | JavaScript: 1 ธันวาคม 2017
2. ความแตกต่างของ Timezone Default
- Python: Default เป็น UTC
- JavaScript: Default เป็น Local Timezone ของผู้ใช้
วิธีจัดการให้เข้ากัน
ใน JavaScript: ใช้ Date.UTC()
// สร้าง timestamp แบบ UTC var utcTimestamp = Date.UTC(2013, 7, 10); // 2013-08-10 00:00:00 UTC // หมายเหตุ: เดือนยังคงเป็น 0-based (7 = สิงหาคม) // สร้าง Date object แบบ UTC var utcDate = new Date(Date.UTC(2013, 7, 10, 12, 30, 0)); // 2013-08-10T12:30:00.000Z
ใน Python: ใช้ timezone-aware datetime
from datetime import datetime, timezone # UTC aware dt_utc = datetime(2013, 8, 10, 12, 30, 0, tzinfo=timezone.utc) # แปลงเป็น timestamp (เหมือน JS) timestamp = dt_utc.timestamp()
รูปแบบมาตรฐานสำหรับสื่อสาร (ISO 8601)
ใช้สตริงมาตรฐาน ISO 8601 เพื่อหลีกเลี่ยงปัญหา:
// JavaScript → ISO String
var isoString = new Date().toISOString(); // "2024-01-15T10:30:00.000Z"
// Python ← Parse ISO String
from datetime import datetime
dt = datetime.fromisoformat(isoString.replace('Z', '+00:00'))
ตารางสรุปความแตกต่าง
| คุณสมบัติ | JavaScript | Python |
|---|---|---|
| Month Range | 0-11 | 1-12 |
| Default Timezone | Local | UTC (naive) / Aware |
| Timestamp Unit | Milliseconds | Seconds |
| ISO String | .toISOString() | .isoformat() |
| Parse ISO | new Date(str) | datetime.fromisoformat() |
Best Practice
- ส่งข้อมูลเป็น ISO 8601 string (UTC)
- เก็บใน Database เป็น UTC
- แปลงเป็น Local Time แค่ตอนแสดงผล (Frontend)
- ใช้ Library:
date-fns,dayjs(JS) /pendulum,arrow(Python)