แนวปฏิบัติที่ดีที่สุดสำหรับการบันทึกเขตเวลาในฐานข้อมูลคืออะไร


13

เราต้องการเริ่มต้นรวบรวมเขตเวลาสำหรับที่อยู่แต่ละแห่งในฐานข้อมูล วิธีที่ดีที่สุดในการจัดเก็บเขตเวลาคืออะไร? คุณจะไปเกี่ยวกับการหาเขตเวลาสำหรับบันทึกที่อยู่ที่มีอยู่ได้อย่างไร

ฉันใช้เซิร์ฟเวอร์ Microsoft SQL, .net mvc, C # ข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.



Btw โซนเวลาปกติ gotcha คือการใช้ int แต่บางเขตเวลาสามารถเป็น + หรือ - 30 นาทีหรือแม้กระทั่ง 15 นาที :) โอ้และจำได้ว่ามันไม่ใช่วิทยาศาสตร์แน่นอน
Rocklan

2
@LachlanB วิธีหนึ่งที่จะนำมันคือโซนเวลาเป็นมากกว่าสถานที่กว่ามันเป็นเวลาชดเชย แต่ถึงกระนั้นมุมมองนั้นก็ยังไม่เพียงพอในตัวของมันเองเช่นรัสเซียเพิ่งเปลี่ยนนโยบายเกี่ยวกับการประหยัดเวลากลางวันซึ่งหมายความว่าคุณต้องปฏิบัติต่อมันแตกต่างกันไปขึ้นอยู่กับวันที่เกิดขึ้นจริง
Daniel B

คำตอบ:


7

คุณต้องการจัดเก็บสิ่งที่ไม่เปลี่ยนแปลงตลอดเวลา (หรือสองครั้งต่อปี) ฐานข้อมูลโซนเวลาhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zonesเป็นสิ่งที่ถูกต้อง ดังนั้นคุณเพียงแค่เก็บจดหมายสองฉบับ

จากฐานข้อมูลนี้คุณสามารถสอบถามการชดเชยเวลาและเวลาออมแสงตามเวลาที่ใช้งานอยู่ มันไม่ได้เป็นเพียงการชดเชยเวลา แต่ยังช่วยให้คุณมีสถานที่มากมายที่ละติจูดเดียวกันจะมีรหัสที่แตกต่างกันและสามารถเปลี่ยนกฎโซนเวลาของตนเองและซอฟต์แวร์ของคุณจะสามารถจัดการกับมันได้

เวลาเดียวที่คุณต้องทำการเปลี่ยนแปลงในฐานข้อมูลของคุณคือเมื่อมีการเปลี่ยนแปลงสถานที่ซึ่งเป็นเขตเวลาซึ่งจะหายาก


โปรดทราบว่ารายการในวิกิพีเดียไม่มีตัวย่อ 2 ตัวอักษรสำหรับทุกเขตเวลาของ IANA - บวกกับการทำแผนที่ไม่ได้ชัดเจน หากคุณต้องการข้อมูลประวัติแบบเต็มให้ไปที่ชื่อเต็มแทน
Hulk

2
รหัสตัวอักษรสองตัวเท่านั้นที่ฉันเห็นในหน้า Wikipedia คือรหัสประเทศ สิ่งเหล่านี้ไม่ได้กำหนดเขตเวลาที่ไม่ซ้ำกัน ตัวอย่างเช่นเขตเวลาทั้งหมดในสหรัฐอเมริกามีรหัสประเทศตัวอักษรสองตัวเดียวกัน: US ในทำนองเดียวกันทั่วประเทศออสเตรเลียมีรหัสประเทศออสเตรเลีย
เอียน

3

แนวปฏิบัติที่เหมาะสมที่สุดคือการใช้ฐานข้อมูลที่สนับสนุนTIMESTAMP WITH TIMEZONEชนิดข้อมูลที่กำหนดโดย SQL99

SQL Server มีชนิดที่เรียกdatetimeoffsetว่าทำทุกอย่างTIMESTAMP WITH TIMEZONEยกเว้นที่เก็บเขตเวลาจริง สิ่งที่คุณทำได้คือจัดเก็บออฟเซ็ตจาก UTC (เช่น2013-05-04 12:34:56 -5:00) ซึ่งหมายความว่าคุณจะต้องตรวจสอบก่อนที่จะจัดเก็บตามเขตเวลา


3

สมมติว่าคุณใช้. Net Framework 4.0 หรือสูงกว่าTimeZoneInfoเป็นสิ่งที่คุณต้องการ

เก็บค่าวันที่ทั้งหมดในฐานข้อมูลในรูปแบบ UTC ใช้ค่า ID หรือผลลัพธ์ของ ToSerializedString () สำหรับแต่ละไคลเอนต์เพื่อสร้างวัตถุ TimeZoneInfo เพื่อแปลงวันที่จัดเก็บเป็นรูปแบบโลคัลเพื่อแสดง


2

คุณบอกว่าคุณต้องการจัดเก็บเขตเวลาสำหรับแต่ละที่อยู่ในฐานข้อมูลของคุณ แต่คุณยังไม่ได้พูดในสิ่งที่คุณต้องการจะทำ การจัดเก็บบางอย่างในฐานข้อมูลนั้นแทบจะไม่สิ้นสุดในตัวเอง

ไม่ว่าในกรณีใดฉันจะใช้ฐานข้อมูล TZหรือที่เรียกว่าฐานข้อมูล Olsen ไม่ว่าโดยตรงหรือโดยใช้ซอฟต์แวร์ชั้นวางที่รวม TZ เข้าด้วยกัน คุณสามารถจัดเก็บเขตเวลาเป็นเพียงสตริงเพื่ออ้างถึงหนึ่งในรายการ TZ DBเช่น 'Africa / Kampala' หรือ 'Europe / Paris'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.