ไม่มีการแก้ไขอย่างรวดเร็วสำหรับเรื่องนี้โชคไม่ดี ความเป็นสากลของแอปพลิเคชั่นควรเป็นส่วนหนึ่งของการอภิปรายการออกแบบครั้งแรกเนื่องจากเป็นส่วนสำคัญของหลาย ๆ ด้านรวมถึงการเปรียบเทียบวันที่ / เวลาและการจัดรูปแบบผลลัพธ์
Anyways ที่จะได้รับในการติดตามการทำมันขวามันเป็นสิ่งสำคัญที่จะเก็บข้อมูลเขตเวลากับเวลา กล่าวอีกนัยหนึ่งการตระหนักว่าวันที่ / เวลา20130407 14:50
นั้นไม่มีความหมายโดยไม่มี (a) รวมถึงออฟเซ็ต UTC ในปัจจุบันของเขตเวลา(หมายเหตุ 1)หรือ (b) ทำให้มั่นใจได้ว่าตรรกะทั้งหมดที่แทรกค่าเหล่านี้ก่อน เป็นไปได้มากที่สุด 0) โดยไม่มีสิ่งเหล่านั้นสองค่าเวลาที่กำหนดเป็นที่เปรียบมิได้และข้อมูลที่เป็นความเสียหาย (วิธีหลังเล่นด้วยไฟ(หมายเหตุ 2)โดยวิธีอย่าทำอย่างนั้น)
ใน SQL Server 2008+ คุณสามารถจัดเก็บออฟเซ็ตตามเวลาได้โดยตรงโดยใช้datetimeoffset
ชนิดข้อมูล (เพื่อความสมบูรณ์ในปี 2005 และก่อนหน้านี้ฉันจะเพิ่มคอลัมน์ที่สองเพื่อจัดเก็บค่าออฟเซ็ต UTC ปัจจุบัน (เป็นนาที))
สิ่งนี้ทำให้ง่ายสำหรับแอปพลิเคชันประเภทเดสก์ท็อปเนื่องจากแพลตฟอร์มเหล่านี้มักมีกลไกในการแปลงวันที่ / เวลา + โซนเวลาเป็นเวลาท้องถิ่นโดยอัตโนมัติแล้วจัดรูปแบบสำหรับการส่งออกทั้งหมดขึ้นอยู่กับการตั้งค่าภูมิภาคของผู้ใช้
สำหรับเว็บซึ่งเป็นสถาปัตยกรรมที่ถูกตัดการเชื่อมต่อโดยเนื้อแท้แม้ว่าจะมีการตั้งค่าข้อมูลแบ็คเอนด์อย่างถูกต้องมันก็ซับซ้อนกว่าเพราะคุณต้องการข้อมูลเกี่ยวกับไคลเอนต์เพื่อให้สามารถทำการแปลงและ / หรือการจัดรูปแบบได้ สิ่งนี้มักจะทำผ่านการตั้งค่าผู้ใช้ (แอปพลิเคชันแปลง / จัดรูปแบบสิ่งต่าง ๆ ก่อนส่งออก) หรือเพียงแสดงสิ่งที่มีรูปแบบคงที่และออฟเซ็ตเขตเวลาเดียวกันสำหรับทุกคน (ซึ่งเป็นสิ่งที่แพลตฟอร์มแลกเปลี่ยน Exchange)
คุณสามารถดูได้ว่าข้อมูลแบ็คเอนด์นั้นไม่ได้รับการตั้งค่าอย่างถูกต้องรวดเร็วเพียงใดมันจะซับซ้อนและแฮ็ค ฉันจะไม่แนะนำให้ลงเส้นทางใด ๆ เหล่านั้นเพราะคุณเพิ่งจะจบลงด้วยปัญหามากขึ้นในบรรทัด
หมายเหตุ 1:
UTC ออฟเซ็ตของเขตเวลาไม่คงที่: พิจารณาการประหยัดในเวลากลางวันโดยที่อ็อฟเซ็ต UTC ของโซนจะแปรผันตามบวกหรือลบชั่วโมง นอกจากนี้วันที่ออมแสงในโซนยังแตกต่างกันไปตามปกติ ดังนั้นการใช้datetimeoffset
(หรือคอมโพสิตของlocal time
และUTC offset at that time
) ส่งผลให้เกิดการกู้คืนข้อมูลสูงสุด
โน้ต 2:
มันเกี่ยวกับการควบคุมอินพุตข้อมูล ในขณะที่ไม่มีวิธีพิสูจน์ความโง่เขลาในการตรวจสอบค่าขาเข้าได้ดีกว่าการบังคับใช้มาตรฐานอย่างง่ายที่ไม่เกี่ยวข้องกับการคำนวณ หาก public API ต้องการประเภทข้อมูลที่มีอ็อฟเซ็ตความต้องการนั้นจะชัดเจนสำหรับผู้โทร
หากไม่ใช่ในกรณีที่ผู้เรียกต้องพึ่งพาเอกสาร (ถ้าพวกเขาอ่าน) หรือการคำนวณจะไม่ถูกต้อง ฯลฯ มีโหมดความล้มเหลว / ข้อผิดพลาดน้อยลงเมื่อต้องการออฟเซ็ตโดยเฉพาะอย่างยิ่งสำหรับระบบกระจาย หรือแม้แต่เว็บ / ฐานข้อมูลบนเซิร์ฟเวอร์แยกต่างหากในกรณีนี้)
การจัดเก็บออฟเซตฆ่านกสองตัวด้วยหินก้อนเดียว และแม้ว่าจะไม่จำเป็นต้องใช้ในตอนนี้ก็ทำให้มีความเป็นไปได้ในภายหลังหากจำเป็น จริงฉันใช้พื้นที่เก็บข้อมูลเพิ่มขึ้น แต่ฉันคิดว่ามันคุ้มค่ากับการแลกเปลี่ยนเพราะข้อมูลจะหายไปหากไม่เคยบันทึกไว้ตั้งแต่แรก