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

เขตเวลาทำให้ความผิดพลาดคำนวณเล็กๆ กลายเป็นสัญญาที่ผิดพลาด การนัดหมายที่เลื่อนไป 1 ชั่วโมงไม่ใช่เรื่อง "ใกล้เคียงพอ" — มันเปลี่ยนคนที่จะมา ใครดูเหมือนไม่เตรียมตัว และใครพลาดสิ่งสำคัญ เมื่อเกิดขึ้นสองครั้ง ผู้คนหยุดเชื่อใจปฏิทินและเริ่มตรวจสอบทุกอย่างในแชทแทน
ปัญหาหลักคือเวลาดูเหมือนเป็นสิ่งคงที่สำหรับมนุษย์ แต่ในซอฟต์แวร์มันไม่คงที่ คนคิดเป็นเวลาบนหน้าปัดนาฬิกาท้องถิ่น ("9:00 AM ของฉัน") ขณะที่คอมพิวเตอร์มักคิดเป็นออฟเซ็ต ("UTC+2") ที่อาจเปลี่ยนในช่วงปี เมื่อแอปของคุณผสมสองแนวคิดนี้ มันอาจแสดงเวลาถูกต้องวันนี้แต่ผิดพลาดในเดือนหน้า
อาการมักดูเหมือนสุ่ม ซึ่งทำให้แย่ลง ผู้ใช้รายงานปัญหาเช่น การประชุม "ย้าย" ทั้งที่ไม่มีใครแก้ไข, การเตือนทำงานเร็วหรือช้า, ชุดเหตุการณ์ที่มีบางอินสแตนซ์เลื่อนไป 1 ชั่วโมง, คำเชิญแสดงเวลาต่างกันบนอุปกรณ์ต่างกัน หรือเหตุการณ์ซ้ำแสดงซ้ำหลังการเดินทาง
ผู้ที่ได้รับผลกระทบมากที่สุดคือผู้ที่พึ่งพาการนัดหมายมาก: ทีมรีโมทข้ามหลายประเทศ ลูกค้าที่จองข้ามพรมแดน และคนที่เดินทาง บางคนคาดหวังให้การนัดหมายคงอยู่ตามเขตเวลาของผู้จัด ในขณะที่ผู้เดินทางคาดหวังให้การนัดหมายตามเวลาท้องถิ่นปัจจุบัน ทั้งสองความคาดหวังมีเหตุผล เพียงแต่มีสิ่งเดียวที่เป็นจริง ดังนั้นคุณต้องมีชุดกฎที่ชัดเจน
นี่ไม่ใช่แค่เรื่องการแสดงเวลาในการ์ดเหตุการณ์ กฎเขตเวลาแตะทุกส่วนของระบบนัดหมาย: เหตุการณ์เดี่ยว เหตุการณ์ซ้ำ การเตือน อีเมลเชิญ และงานใดๆ ที่ทริกเกอร์ในช่วงเวลาใดเวลาหนึ่ง ถ้าคุณไม่กำหนดกฎสำหรับแต่ละส่วน ข้อมูลของคุณจะนิ่งๆ กำหนดกฎแทนคุณ และผู้ใช้จะค้นพบกฎด้วยวิธีที่ไม่ดี
ตัวอย่างง่ายๆ: สแตนด์อัพรายสัปดาห์ "วันจันทร์ 9:00 AM" ถูกสร้างในเดือนมีนาคม ในเดือนเมษายน DST เปลี่ยนสำหรับผู้เข้าร่วมบางคน ถ้าแอปของคุณเก็บเป็น "ทุก 7 วันที่จุดเวลาคงที่ใน UTC" ผู้ใช้คนนั้นจะเห็นเวลาที่ 10:00 AM ถ้าแอปเก็บเป็น "ทุกวันจันทร์ 9:00 AM ในเขตเวลาของผู้จัด" มันจะยังคงเป็น 9:00 AM แต่ค่าจุดเวลา UTC จะเปลี่ยน ทั้งสองทางเลือกใช้ได้ แต่แอปต้องสม่ำเสมอและซื่อสัตย์เกี่ยวกับมัน
บั๊กเขตเวลาส่วนใหญ่เกิดจากการสับสนแนวคิดพื้นฐานไม่กี่อย่าง การใช้คำให้ถูกต้องยังช่วยให้ข้อความ UI ชัดเจนขึ้น
UTC (Coordinated Universal Time) คือเข็มนาฬิกาอ้างอิงระดับโลก คิดว่าเป็นเส้นเวลาร่วมเดียวที่ทุกคนแชร์
"เวลาสัมบูรณ์" คือช่วงเวลาเฉพาะบนเส้นเวลานั้น เช่น 2026-01-16 15:00:00 UTC ถ้าสองคนในประเทศต่างกันมองช่วงเวลานั้น พวกเขาควรเห็นช่วงเวลาเดียวกัน เพียงแสดงด้วยนาฬิกาท้องถิ่นที่ต่างกัน
เวลาท้องถิ่นคือสิ่งที่คนเห็นบนหน้าปัดนาฬิกา เช่น "9:00 AM" เพียงอย่างเดียวมันไม่พอที่จะระบุช่วงเวลา คุณต้องมีกฎสถานที่
ออฟเซ็ตคือความต่างจาก UTC ณ ช่วงเวลาหนึ่ง เช่น UTC+2 หรือ UTC-5 ออฟเซ็ตจะเปลี่ยนตลอดปีในหลายพื้นที่ ดังนั้นการเก็บเพียง "UTC+2" มีความเสี่ยง
รหัสเขตเวลาเป็นชุดกฎจริง มักเป็นชื่อ IANA เช่น America/New_York หรือ Europe/Berlin รหัสเหล่านี้เก็บประวัติและการเปลี่ยนแปลงในอนาคตของโซน รวมถึง DST
ความแตกต่างเชิงปฏิบัติ:
DST คือช่วงที่ภูมิภาคขยับนาฬิกาไปข้างหน้า/ถอยหลัง ปกติหนึ่งชั่วโมง นั่นหมายความว่าออฟเซ็ต UTC จะเปลี่ยน
สองเหตุการณ์ที่ทำให้เซอร์ไพรซ์:
เวลาแบบหน้าปัดคือสิ่งที่ผู้ใช้พิมพ์: "ทุกวันจันทร์ 9:00 AM" เวลาแบบสัมบูรณ์คือสิ่งที่ระบบของคุณต้องทำงาน: "ส่งการเตือนในจุดเวลา UTC ที่แน่นอนนี้" เหตุการณ์ซ้ำมักเริ่มจากกฎบนหน้าปัด แล้วถูกแปลงเป็นชุดเวลาสัมบูรณ์
ผู้ใช้คิดว่าพวกเขาจอง "9:00 AM ในเขตเวลาของฉัน" ฐานข้อมูลของคุณอาจเก็บเป็น 2026-03-10 13:00 UTC ทั้งสองสามารถถูกต้องได้ แต่ต้องระบุด้วยว่าตั้งใจใช้กฎเขตเวลาไหน
อุปกรณ์ก็เปลี่ยนเขตเวลาได้ ผู้คนเดินทาง และแล็ปท็อปอาจเปลี่ยนโซนอัตโนมัติ ถ้าแอปของคุณตีความใหม่อย่างเงียบๆ ว่า "9:00 AM" ที่บันทึกไว้ใช้โซนใหม่ของอุปกรณ์ ผู้ใช้จะรู้สึกว่าเวลาถูก "ย้าย" ทั้งที่พวกเขาไม่ได้ทำอะไร
บั๊ก "การประชุมของฉันย้าย" ส่วนใหญ่เป็นบั๊กของโมเดลข้อมูล ดีฟอลต์ที่ปลอดภัยสำหรับเหตุการณ์ครั้งเดียวคือ: เก็บเป็นจุดเวลาเดียวใน UTC แล้วแปลงเป็นเวลาท้องถิ่นของผู้ดูเมื่อแสดงเท่านั้น
เหตุการณ์ครั้งเดียวเช่น "12 ต.ค. 2026 เวลา 15:00 ที่เบอร์ลิน" ช่วงเวลานั้นเกิดขึ้นครั้งเดียว หากเก็บเป็น UTC (จุดบนเส้นเวลา) มันจะแมปกลับเป็นช่วงเวลาเดิมเสมอ ไม่ว่าผู้ดูอยู่ที่ไหน
การเก็บเพียงเวลาท้องถิ่น (เช่น "15:00") จะพังเมื่อมีคนดูจากโซนอื่น หรือเมื่อผู้สร้างเปลี่ยนการตั้งค่าอุปกรณ์ การเก็บเพียงออฟเซ็ต (เช่น "+02:00") ก็พังเมื่อออฟเซ็ตเปลี่ยนตาม DST "+02:00" ไม่ใช่สถานที่ มันเป็นกฎชั่วคราว
ควรเก็บรหัสเขตเวลาพร้อม UTC เมื่อใด? ทุกครั้งที่คุณใส่ใจว่าผู้สร้างตั้งใจอย่างไร ไม่ใช่แค่จุดเวลาที่เก็บ รหัสโซนเช่น Europe/Berlin ช่วยเรื่องการแสดง auditing และการซัพพอร์ต และจะจำเป็นสำหรับเหตุการณ์ซ้ำ มันช่วยให้คุณพูดได้ว่า: "เหตุการณ์นี้ถูกสร้างเป็น 15:00 เวลาเบอร์ลิน" แม้ว่าออฟเซ็ตของเบอร์ลินจะเปลี่ยนเดือนหน้า
เรคคอร์ดปฏิบัติสำหรับเหตุการณ์ครั้งเดียวมักรวม:
start_at_utc (และ end_at_utc)created_at_utccreator_time_zone_id (ชื่อ IANA)original_input (ข้อความหรืฟิลด์ที่ผู้ใช้ป้อน)input_offset_minutes (ทางเลือก สำหรับดีบัก)สำหรับซัพพอร์ต ฟิลด์เหล่านี้เปลี่ยนคำร้องเรียนคร่าวๆ ให้กลายเป็นการเล่นซ้ำที่ชัดเจน: ผู้ใช้พิมพ์อะไร อุปกรณ์ของพวกเขารายงานโซนอะไร และระบบของคุณเก็บจุดเวลาใด
เข้มงวดเกี่ยวกับที่ที่แปลงเกิดขึ้น จงถือเซิร์ฟเวอร์เป็นแหล่งความจริงสำหรับการจัดเก็บ (เฉพาะ UTC) และถือไคลเอ็นต์เป็นแหล่งความตั้งใจ (เวลาท้องถิ่นพร้อมรหัสเขตเวลา) แปลงเวลาท้องถิ่นเป็น UTC ครั้งเดียวเมื่อสร้างหรือแก้ไข และอย่า "แปลงซ้ำ" UTC ที่เก็บไว้เมื่ออ่านในภายหลัง การเลื่อนเงียบๆ มักเกิดเมื่อทั้งฝั่งไคลเอ็นต์และเซิร์ฟเวอร์แปลง หรือเมื่อฝ่ายใดฝ่ายหนึ่งเดาโซนแทนการใช้โซนที่ให้มา
ถ้าคุณรับเหตุการณ์จากหลายไคลเอ็นต์ ให้ล็อกโซนและตรวจสอบมัน หากขาด ให้ถามผู้ใช้ให้เลือกแทนการเดา คำถามเล็กๆ นั้นป้องกันตั๋วโกรธๆ ได้มาก
เมื่อผู้ใช้เห็นเวลายังคง "ย้าย" มันมักเพราะส่วนต่างๆ ของระบบแปลงเวลาแตกต่างกัน
จงเลือกที่เดียวเป็นแหล่งความจริงสำหรับการแปลง หลายทีมเลือกเซิร์ฟเวอร์เพราะรับประกันผลลัพธ์เดียวกันสำหรับเว็บ โมบาย อีเมล และงานแบ็กกราวนด์ ไคลเอ็นต์ยังสามารถพรีวิว แต่เซิร์ฟเวอร์ควรยืนยันค่าที่เก็บสุดท้าย
พายพ์ไลน์ที่ทำซ้ำได้ช่วยหลีกเลี่ยงความประหลาดใจ:
2026-03-10 09:00) และเขตเวลาเหตุการณ์เป็นชื่อ IANA (America/New_York) ไม่ใช้คำย่ออย่าง "EST"ตัวอย่าง: โฮสต์ในนิวยอร์กสร้าง "อังคาร 9:00 AM (America/New_York)" เพื่อนร่วมงานในเบอร์ลินเห็นเป็น "3:00 PM (Europe/Berlin)" เพราะจุดเวลา UTC เดียวกันแสดงเป็นโซนของพวกเขา
เหตุการณ์ทั้งวันไม่ใช่ "00:00 UTC ถึง 00:00 UTC" โดยทั่วไปเป็นช่วงวันที่ในเขตเวลาที่ระบุ เก็บเหตุการณ์ทั้งวันเป็นค่า date-only (start_date, end_date) บวกโซนที่ใช้ตีความวันนั้น มิฉะนั้นเหตุการณ์ทั้งวันอาจปรากฏเริ่มวันก่อนสำหรับผู้ใช้ทางตะวันตกของ UTC
ก่อนปล่อยทดสอบกรณีจริง: สร้างเหตุการณ์ เปลี่ยนโซนของอุปกรณ์ แล้วเปิดใหม่ เหตุการณ์ควรยังคงเป็นช่วงเวลาเดิม (สำหรับเหตุการณ์ที่มีเวลา) หรือวันที่ท้องถิ่นเดิม (สำหรับเหตุการณ์ทั้งวัน) ไม่ใช่เลื่อนเงียบๆ
บั๊กการนัดหมายส่วนใหญ่ปรากฏเมื่อเหตุการณ์วนซ้ำ ความผิดพลาดทั่วไปคือถือว่าการวนซ้ำคือ "แค่คัดลอกวันที่ไปข้างหน้า" ก่อนอื่นตัดสินใจว่าเหตุการณ์ถูกสมอไว้กับอะไร:
สำหรับปฏิทินส่วนใหญ่ (การประชุม การเตือน ชั่วโมงทำงาน) ผู้ใช้คาดหวังเวลาบนหน้าปัด "ทุกวันจันทร์ 9:00 AM" มักหมายถึง 9:00 AM ในเมืองที่เลือก ไม่ใช่ "จุดเวลา UTC เดิมตลอดไป"
เก็บกฎการวนซ้ำเป็นกฎพร้อมบริบทที่จำเป็นในการตีความ อย่าเก็บเป็นลิสต์เวลาที่สร้างไว้ล่วงหน้า:
นี้ช่วยให้คุณจัดการ DST โดยไม่เกิดการเลื่อนเงียบๆ และทำให้การแก้ไขคาดเดาได้
เมื่อคุณต้องการเหตุการณ์ในช่วงวันที่ ให้สร้างในเวลาท้องถิ่นในโซนของเหตุการณ์ จากนั้นแปลงแต่ละอินสแตนซ์เป็น UTC เพื่อเก็บหรือเปรียบเทียบ กุญแจคือการเพิ่ม "หนึ่งสัปดาห์" หรือ "จันทร์หน้า" ในเชิงท้องถิ่น ไม่ใช่ "+ 7 * 24 ชั่วโมง" ใน UTC
การทดสอบเชิงความคิดง่ายๆ: ถ้าผู้ใช้เลือก 9:00 AM รายสัปดาห์ในเบอร์ลิน ทุกอินสแตนซ์ที่สร้างควรเป็น 9:00 AM เวลาเบอร์ลิน ค่าจุดเวลา UTC จะเปลี่ยนเมื่อเบอร์ลินเปลี่ยน DST และนั่นคือสิ่งที่ถูกต้อง
เมื่อผู้ใช้เดินทาง จงชัดเจนเรื่องพฤติกรรม เหตุการณ์สมอไว้กับเบอร์ลินควรยังเกิดขึ้นเวลา 9:00 AM เบอร์ลิน และผู้เดินทางในนิวยอร์กจะเห็นเป็นเวลาท้องถิ่นที่แปลงมา หากคุณรองรับเหตุการณ์แบบ "ลอย" ที่ตามโซนปัจจุบันของผู้ดู ให้ติดป้ายชัดเจน มันมีประโยชน์ แต่ทำให้คนแปลกใจเมื่อไม่ได้บอก
ปัญหา DST รู้สึกสุ่มสำหรับผู้ใช้เพราะแอปแสดงเวลาอย่างหนึ่งตอนพวกเขาจอง แล้วแสดงต่างออกไปทีหลัง การแก้ไขไม่ใช่แค่เชิงเทคนิค คุณต้องมีกฎที่ชัดเจนและคำพูดที่ชัดเจน
เมื่อเข็มนาฬิกาขยับไปข้างหน้า บางเวลาท้องถิ่นไม่มีจริง ตัวอย่างคลาสสิกคือ 02:30 ในคืนเริ่ม DST ถ้าคุณให้คนเลือกเวลาแบบนั้น คุณต้องตัดสินใจว่ามันหมายถึงอะไร
เมื่อเข็มนาฬิกาถอยหลัง เวลาบนหน้าปัดเดิมเกิดขึ้นสองครั้ง "01:30" อาจหมายถึงครั้งแรก (ก่อนการเปลี่ยน) หรือครั้งที่สอง (หลังการเปลี่ยน) ถ้าคุณไม่ถาม คุณกำลังเดา และคนจะสังเกตเมื่อเข้าร่วมก่อนหรือหลังชั่วโมงจริง
กฎปฏิบัติที่ป้องกันความประหลาดใจ:
ตัวอย่างตั๋วซัพพอร์ตสมจริง: ใครสักคนจอง "02:30" ในนิวยอร์กสำหรับเดือนหน้า แล้ววันมาถึงแอปเงียบๆ แสดงเป็น "03:30" ข้อความที่ดีกว่าเมื่อสร้างง่าย: "เวลานี้ไม่มีในวันที่ 10 มี.ค. เนื่องจากการเปลี่ยนแปลงนาฬิกา เลือก 01:30 หรือ 03:00" หากคุณปรับอัตโนมัติให้พูดว่า: "เราเลื่อนไปเป็น 03:00 เพราะ 02:30 ถูกข้ามในคืนนั้น"
ถ้าคุณมอง DST เป็นแค่ขอบ UI มันจะกลายเป็นปัญหาความเชื่อถือ ถ้าปฏิบัติกับมันเป็นกฎของผลิตภัณท์ มันจะทำนายได้
ตั๋วโกรธส่วนใหญ่มาจากความผิดพลาดซ้ำๆ แอปดูเหมือน "เปลี่ยน" เวลา แต่ปัญหาจริงคือกฎไม่ได้ถูกกำหนดไว้อย่างชัดเจนในข้อมูล โค้ด และข้อความ
ความล้มเหลวทั่วไปคือบันทึกเฉพาะออฟเซ็ต (เช่น -05:00) แทนที่จะเป็นโซน IANA จริง (เช่น America/New_York) ออฟเซ็ตเปลี่ยนเมื่อ DST เริ่มหรือยุติ เหตุการณ์ที่ดูถูกต้องในมีนาคมอาจผิดในพฤศจิกายน
ตัวย่อเขตเวลาก็เป็นแหล่งบั๊กบ่อยเช่นกัน "EST" อาจหมายความต่างกันในระบบต่างๆ และบางแพลตฟอร์มแม็ปคำย่อไม่สอดคล้องกัน เก็บ ID เต็มของเขตเวลาและถือว่าคำย่อเป็นข้อความแสดงเท่านั้น หากคุณแสดงมันเลย
เหตุการณ์ทั้งวันก็เป็นหมวดหมู่ของตัวเอง หากเก็บเหตุการณ์ทั้งวันเป็น "เที่ยงคืน UTC" ผู้ใช้ที่มีออฟเซ็ตเป็นลบมักเห็นว่ามันเริ่มวันก่อน เก็บเหตุการณ์ทั้งวันเป็นวันที่บวกโซนที่ใช้ตีความวันเหล่านั้น
เช็คลิสต์สั้นๆ สำหรับการตรวจโค้ด:
00:00 UTC)การเตือนและคำเชิญอาจผิดแม้การจัดเก็บเหตุการณ์ถูกต้อง ตัวอย่าง: ผู้ใช้สร้าง "9:00 AM เวลาเบอร์ลิน" และคาดหวังเตือน 8:45 AM เวลาเบอร์ลิน หากตัวจัดตารางงานของคุณรันใน UTC แล้วคุณเผลอถือว่า "8:45" คือเวลาท้องถิ่นของเซิร์ฟเวอร์ การเตือนจะทำงานเร็วหรือช้า
ความแตกต่างข้ามแพลตฟอร์มทำให้แย่ลง ไคลเอ็นต์หนึ่งอาจตีความเวลาที่กำกวมโดยใช้โซนของอุปกรณ์ อีกไคลเอ็นต์ใช้โซนเหตุการณ์ และอีกไคลเอ็นต์ใช้กฎ DST ที่แคชไว้ หากต้องการพฤติกรรมสอดคล้อง ให้เก็บการแปลงและการขยายการวนซ้ำไว้ในที่เดียว (มักเป็นเซิร์ฟเวอร์) เพื่อให้ไคลเอ็นต์ทุกตัวเห็นผลเดียวกัน
การทดสอบความสมเหตุสมผลง่ายๆ: สร้างเหตุการณ์หนึ่งช่วงสัปดาห์ที่ DST เปลี่ยน ดูบนอุปกรณ์สองเครื่องที่ตั้งค่าโซนต่างกัน และยืนยันเวลาเริ่ม วันที่ และเวลาเตือนตรงกับกฎที่คุณสัญญากับผู้ใช้
บั๊กเขตเวลาส่วนใหญ่มักไม่ปรากฏระหว่างการพัฒนา แต่จะเมื่อมีคนเดินทาง เมื่อ DST พลิก หรือเมื่อสองคนเทียบภาพหน้าจอ
ทำให้โมเดลข้อมูลของคุณตรงกับชนิดเวลาที่คุณจัดการ เหตุการณ์ครั้งเดียวต้องการช่วงเวลาจริงเดียว เหตุการณ์ซ้ำต้องการกฎผูกกับสถานที่
America/New_York) ไม่ใช่ออฟเซ็ตเท่านั้น2026-01-16T14:00Z)DST สร้างสองช่วงอันตราย: เวลาที่ไม่มี (spring forward) และเวลาที่ซ้ำ (fall back) แอปของคุณต้องตัดสินใจและทำอย่างสม่ำเสมอ
สถานการณ์ทดสอบ: ซิงค์ทีมรายสัปดาห์ตั้งเป็น "จันทร์ 09:00" ในเบอร์ลิน ตรวจเวลาให้คนในนิวยอร์กก่อนและหลังยุโรปเปลี่ยน DST และอีกครั้งหลังสหรัฐเปลี่ยน (พวกเขาเปลี่ยนวันที่ต่างกัน)
ตั๋วโกรธหลายรายมาจาก UI ที่ซ่อนเขตเวลา คนมักสมมติในสิ่งที่ต้องการให้เป็นจริง
อย่าอาศัยโซนของแล็ปท็อปคุณและรูปแบบโลเคลเดียว
ผู้ก่อตั้งในลอนดอนตั้งสแตนด์อัพรายสัปดาห์กับเพื่อนร่วมงานในนิวยอร์ก พวกเขาเลือก "อังคาร 10:00" และคาดว่ามันจะยังเป็นเช้าสำหรับลอนดอนและเช้าแต่ต้นสำหรับนิวยอร์ก
การตั้งค่าที่ปลอดภัยกว่าคือถือการประชุมเป็น "10:00 ใน Europe/London ทุกวันอังคาร" คำนวณแต่ละอินสแตนซ์ในเวลา London เก็บจุดเวลา (UTC) ของอินสแตนซ์นั้น และแสดงเป็นเวลาท้องถิ่นของผู้ดู
รอบช่องว่าง DST ที่สหรัฐเปลี่ยนเร็วกว่าสหราชอาณาจักร:
ไม่มีอะไร "ย้าย" สำหรับผู้จัด มันยังคงเป็น 10:00 ลอนดอน สิ่งเดียวที่เปลี่ยนคือออฟเซ็ตของนิวยอร์กชั่วคราว
การเตือนควรตามสิ่งที่แต่ละคนเห็น ไม่ใช่สิ่งที่พวกเขา "เคยเห็น" ถ้าคนในนิวยอร์กตั้งเตือน 15 นาที มันควรทำงาน 05:45 ก่อนการเปลี่ยนของสหรัฐ แล้วเป็น 06:45 ในสัปดาห์ช่องว่าง โดยไม่มีใครแก้ไขเหตุการณ์
เพิ่มการแก้ไข: หลังจากสองเช้าทรมาน ผู้จัดลอนดอนเปลี่ยนสแตนด์อัพเป็น 10:30 ลอนดอน เริ่มสัปดาห์หน้า ระบบที่ดีรักษาความตั้งใจโดยใช้การเปลี่ยนในโซนผู้จัด สร้างจุดเวลา UTC ใหม่สำหรับอินสแตนซ์ในอนาคต และปล่อยให้เหตุการณ์ที่ผ่านมาไม่เปลี่ยน
ข้อความที่ดีป้องกันตั๋วซัพพอร์ต: "วนทุกวันอังคารเวลา 10:00 (เวลา London). ผู้ถูกเชิญเห็นเป็นเวลาท้องถิ่นของพวกเขา เวลาอาจเปลี่ยน 1 ชั่วโมงเมื่อเริ่มหรือสิ้นสุดการปรับเวลาออมแสง"
บั๊กเขตเวลาส่วนใหญ่ที่ผู้ใช้รายงานจริงๆ แล้วคือบั๊กความคาดหวัง โมเดลข้อมูลของคุณอาจถูกต้อง แต่ถ้าข้อความ UI คลุมเครือ ผู้คนจะสมมติว่าแอปจะอ่านข้อความในหัวของพวกเขา ให้เขตเวลาเป็นสัญญา UX ไม่ใช่แค่รายละเอียดแบ็กเอนด์
เริ่มด้วยข้อความที่ระบุชื่อโซนทุกที่ที่มีการแสดงเวลาโดยเฉพาะในการแจ้งเตือนและอีเมล อย่าพึ่งพา "10:00 AM" อย่างเดียว ให้โซนอยู่ใกล้กันและทำรูปแบบให้สม่ำเสมอ
รูปแบบข้อความที่ลดความสับสน:
วัน DST ก็ต้องมีข้อความข้อผิดพลาดที่เป็นมิตร หากผู้ใช้เลือกเวลาที่ไม่มี (เช่น 2:30 AM ในคืน spring-forward) หลีกเลี่ยงคำศัพท์เทคนิคและให้ตัวเลือก: "2:30 AM ไม่มีในวันที่ 10 มี.ค. เพราะนาฬิกาขยับ เลือก 1:30 AM หรือ 3:30 AM" หากเวลาเกิดซ้ำในคืน fall-back ให้ถามตรงๆ: "คุณหมายถึง 1:30 AM ครั้งแรกหรือครั้งที่สอง?"
เพื่อสร้างให้ปลอดภัย ให้ทำต้นแบบโฟลว์เต็ม (สร้าง เชิญ ดูในโซนอื่น แก้ไขหลัง DST) ก่อนขัดเกลาอินเทอร์เฟซ:
ถ้าคุณกำลังสร้างฟีเจอร์การนัดหมายอย่างรวดเร็ว แพลตฟอร์มแชทต่อแอปอย่าง Koder.ai สามารถช่วยให้คุณวนกฎ สคีมา และ UI ไปพร้อมกัน ความเร็วดี แต่วินัยเดิมยังใช้ได้: เก็บจุดเวลาเป็น UTC, เก็บ IANA zone ของเหตุการณ์เพื่อความตั้งใจ, และแสดงให้ผู้ใช้เห็นว่าเขากำลังดูโซนไหน