ตัวอย่าง
ในฟังก์ชัน Insert
มีการเก็บข้อมูล Student โดยในฟิลด์ Birth
ได้แยก DateTime.Kind
ออกเป็นสองแบบ คือ DateTimeKind.Utc
และ DateTimeKind.Local
$ curl -s http://localhost:5000/api/student/insert | jq[
{
"birth": "2020-06-06T15:58:02.414755Z",
"kind": "Utc",
"name": "wk (Utc)"
},
{
"birth": "2020-06-06T22:58:02.414755+07:00",
"kind": "Local",
"name": "wk (Local)"
}
]
แต่เมื่อดึงข้อมูลผ่าน DbContext
ของ EF Core กลับพบว่า DateTimeKind
ทั้งสองแบบถูกเซ็ตเป็น Unspecified
หมายความว่า เราไม่มีทางรู้ว่า DateTime ที่ได้นั้น เป็น Local Time Zone (+7 สำหรับประเทศไทย) หรือ Utc (+0)
$ curl -s http://localhost:5000/api/student/query | jq[
{
"birth": "2020-06-06T15:58:02.414755",
"kind": "Unspecified",
"name": "wk (Utc)"
},
{
"birth": "2020-06-06T22:58:02.414755",
"kind": "Unspecified",
"name": "wk (Local)"
}
]
ปัญหานี้เกิดจาก ข้อจำกัดของ DBMS เช่น SQLite / MSSQL ไม่สามารถเก็บฟิลด์ DateTime + Kind ของ .NET ได้
ดังนั้น เพื่อป้องกันความสับสน การเก็บข้อมูลจึงควรเลือก Time Zone อย่างใดอย่างหนึ่งเท่านั้น เช่น เปลี่ยน DateTime.Kind
เป็น DateTimeKind.Utc
ก่อน เช่น
context.Students.Add
({ Id = 0
Name = "wk"
Birth = date.ToUniversalTime() })