ฉันมีเว็บไซต์ที่โฮสต์ในเขตเวลาที่แตกต่างจากผู้ใช้ที่ใช้แอปพลิเคชัน นอกจากนี้ผู้ใช้สามารถมีเขตเวลาที่เฉพาะเจาะจง ฉันสงสัยว่าผู้ใช้และแอปพลิเคชั่น SO อื่น ๆ เข้าหาสิ่งนี้อย่างไร ส่วนที่ชัดเจนที่สุดคือภายใน DB วันที่ / เวลาจะถูกเก็บไว้ใน UTC เมื่ออยู่บนเซิร์ฟเวอร์ควรจัดการวันที่ / เวลาทั้งหมดใน UTC อย่างไรก็ตามฉันเห็นปัญหาสามข้อที่ฉันพยายามเอาชนะ:
รับเวลาปัจจุบันใน UTC (แก้ไขได้อย่างง่ายดายด้วย
DateTime.UtcNow
)ดึงวันที่ / เวลาจากฐานข้อมูลและแสดงสิ่งเหล่านี้กับผู้ใช้ อาจมีการโทรจำนวนมากที่จะพิมพ์วันที่ในมุมมองที่ต่างกัน ฉันกำลังคิดถึงเลเยอร์บางอย่างระหว่างมุมมองและตัวควบคุมที่สามารถแก้ปัญหานี้ได้ หรือมีวิธีการขยายแบบกำหนดเองใน
DateTime
(ดูด้านล่าง) ข้อเสียที่สำคัญคือทุกครั้งที่ใช้ datetime ในมุมมองต้องใช้วิธีการขยาย!JsonResult
นอกจากนี้ยังจะเพิ่มความยากลำบากในการใช้สิ่งที่ต้องการ คุณไม่สามารถจะเรียกมันจะต้องมีการJson(myEnumerable)
Json(myEnumerable.Select(transformAllDates))
AutoMapper อาจช่วยในสถานการณ์นี้ได้ไหมรับอินพุตจากผู้ใช้ (Local เป็น UTC) ตัวอย่างเช่นการโพสต์แบบฟอร์มด้วยวันที่จะต้องแปลงวันที่เป็น UTC ก่อน
ModelBinder
สิ่งแรกที่มาถึงใจคือการสร้างที่กำหนดเอง
นี่คือส่วนขยายที่ฉันคิดว่าใช้ในมุมมอง:
public static class DateTimeExtensions
{
public static DateTime UtcToLocal(this DateTime source,
TimeZoneInfo localTimeZone)
{
return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
}
public static DateTime LocalToUtc(this DateTime source,
TimeZoneInfo localTimeZone)
{
source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
}
}
ฉันคิดว่าการจัดการกับเขตเวลาจะเป็นเรื่องธรรมดาเมื่อพิจารณาจากแอปพลิเคชั่นมากมายตอนนี้ใช้ระบบคลาวด์ซึ่งเวลาท้องถิ่นของเซิร์ฟเวอร์อาจแตกต่างจากโซนเวลาที่คาดไว้มาก
สิ่งนี้ได้รับการแก้ไขอย่างงดงามมาก่อนหรือไม่? มีอะไรที่ฉันขาดหายไปไหม ความคิดและความคิดมีความชื่นชมมาก
แก้ไข:เพื่อล้างความสับสนฉันคิดว่าเพิ่มรายละเอียดเพิ่มเติม ปัญหาในตอนนี้ไม่ใช่วิธีการจัดเก็บเวลา UTC ในฐานข้อมูล แต่เป็นข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการดำเนินการจาก UTC-> ท้องถิ่นและท้องถิ่น -> UTC @Max Zerbini ชี้ว่าเห็นได้ชัดว่ามันฉลาดที่จะใส่ UTC-> Local code ในมุมมอง แต่ใช้DateTimeExtensions
คำตอบจริงหรือไม่ เมื่อรับข้อมูลจากผู้ใช้การรับวันที่เป็นเวลาท้องถิ่นของผู้ใช้ (เนื่องจากเป็นสิ่งที่ JS จะใช้) จากนั้นใช้ a ModelBinder
เพื่อแปลงเป็น UTC หรือไม่ เขตเวลาของผู้ใช้จะถูกเก็บไว้ในฐานข้อมูลและดึงข้อมูลได้ง่าย
ModelBinder
ตนเอง