أدوات المطور · محول الطابع الزمني يونكس
خطأ off-by-1000: عندما يظهر التاريخ يناير 1970 أو السنة 56000
· لماذا يهم
الطوابع الزمنية تصحيح الأخطاء سير عمل المطور
يعد مرور الثواني حيث من المتوقع المللي ثانية (أو العكس) هو خطأ الطابع الزمني الأكثر شيوعًا. وهذه التدوينة توضح كيف يبدو في كل اتجاه، وأين يختبئ بين اللغات، وكيفية التقاطه في ثواني.
انضم كل مستخدم في 1 يناير 1970 — الشاشة التي تكشف الخطأ، والواجهة الخلفية التي كانت صحيحة تمامًا
تعد صفحة الملف الشخصي التي تعرض كل حساب بالقرب من شهر يناير 1970 من الأعراض القوية على نطاق واسع. ربما أعادت الواجهة الخلفية ثوانٍ الحقبة الصحيحة بينما قام كود الواجهة الأمامية بتمريرها مباشرة إلى مُنشئ التاريخ الذي يفسر المللي ثانية. ثم يتقلص العدد الحالي بعامل الألف على محور التقويم.
لا تقم بتصحيح الشاشة بإضافة سنة ثابتة أو استبدال التاريخ. التقط الحقل الأولي وعقده API واستدعاء المُنشئ الدقيق. يتيح لك ToolAcre فرض كلتا الوحدتين، بحيث يمكن اختبار قيمة واحدة دون تغيير بيانات الإنتاج. تحدد القراءة المطابقة لحدث معروف آخر الخطأ الحدي المحتمل.
العَرَضان — ثانية تغذيها ميلي ثانية API تهبط في يناير 1970، ومللي ثانية تغذيها ثانية API تهبط بعد عشرات الآلاف من السنين
الثواني التي يتم تفسيرها على أنها ميلي ثانية تقترب من العصر لأن مليار ميلي ثانية لا تمثل سوى جزء صغير من قرن. ويعمل الخطأ العكسي على توسيع قيمة تريليون مللي ثانية إلى تريليون ثانية، وغالبًا ما يكون ذلك خارج نطاقات التطبيقات العادية. يحافظ كلا الفشلين على الأرقام أثناء تغيير مقياسها.
تشرح المقالة المنشورة المكونة من عشرة أرقام مقابل ثلاثة عشر رقمًا الاستدلال البصري المعاصر وحدوده. تركز هذه المقالة بدلاً من ذلك على التشخيص والوقاية: اختيار واضح للوحدة، وأدلة حدث مستقلة، وتحويل واحد في الواجهة حيث يفي تمثيل المنتج بعقد المستهلك.
نظرًا لأن كلا الفرعين حتميان، فمن الممكن تكرار العرض باستخدام أداة واحدة. وهذا يجعل إثبات عدم تطابق الوحدة أسهل من إثبات انحراف الساعة المتقطع أو سلوك التنسيق المحلي.
حيث يكون الحد عادةً — JavaScript وJava بالمللي ثانية، وأدوات Unix، وPython ومعظم قواعد البيانات بالثواني، والحمولة JSON بينهما
يثبت هذا المستودع أن JavaScript التاريخ يستهلك ميلي ثانية وأن ToolAcre يتضاعف ثواني قبل إنشاء واحد. ولا يقوم بإنشاء الإعدادات الافتراضية لكل Java أو Python أو Shell أو قاعدة البيانات API المذكورة في المصنف. ويجب التحقق من هذه العقود حيث يتم استخدامها.
لا يحمل الرقم JSON أي بيانات تعريفية للوحدة. تؤدي تسمية الحقل `created_at` إلى نقل الغموض عبر الخدمات؛ تسميته `created_at_s` أو توثيق سلسلة ISO يجعل العقد قابلاً للمراجعة. يجب أن يقوم محول الاستقبال بالتحويل مرة واحدة إلى تمثيله الداخلي بدلاً من تشتيت الضربات عبر طرق العرض.
اكتب التحويل بجوار تعريف الحدود، وليس داخل مساعد العرض القابل لإعادة الاستخدام. يعرف المحول عقد المنتج؛ يجب أن يتلقى المنسق العام لحظة تمت تسويتها بالفعل.
حدود الوحدة API محددة؛ يثبت هذا المستودع أن JavaScript يستخدم التاريخ بالمللي ثانية
لا يمكن للتركيبات الضعيفة مثل `0` اكتشاف الخطأ لأن صفر ثانية وصفر مللي ثانية كلاهما يطلقان على العصر. قد تبدو القيم الملفقة الصغيرة أيضًا وكأنها تواريخ 1970 معقولة. إن النموذج الوهمي الذي يُرجع نفس المقياس الذي يتوقعه المستهلك لا يمارس أبدًا عدم تطابق حقيقي في التكامل.
اختر لحظة معروفة غير صفرية واجعل التفسيرين مختلفين بشكل ملحوظ. تأكد من نتيجة ISO الأساسية عند الحد، وليس مجرد وجود كائن التاريخ. قم بتضمين حالة ميلي ثانية وحالة ثانية؛ تقارن اختبارات ToolAcre الخاصة 1,000,000 تحت كل وحدة لهذا السبب بالضبط.
تبقى أخطاء الوحدة حية عندما تفشل الاختبارات في التمييز بين المقياسين
خذ بعين الاعتبار `created_at: 1738578000`. يتم فرضه بالثواني، ويصبح `2025-02-03T10:20:00.000Z`؛ يُفرض بالمللي ثانية، ويصبح `1970-01-21T02:56:18.000Z`. يعمل سجل النشر المعروف أنه تم إنشاؤه في فبراير 2025 على حل الغموض دون الاعتماد فقط على عدد الأرقام.
احتفظ بالخام JSON بجوار هذا الحدث المعروف أثناء إصلاح المحول. إذا كان الحقل `1738578000000`، فإن تفسير المللي ثانية سيحدد نفس اللحظة. لا ينبغي أبدًا قبول القيمتين بالتبادل داخل مخطط واحد، على الرغم من أن المحول يمكنه إثبات تكافؤهما بعد تطبيق المقياس الصحيح.
تاريخ النشر المعروف هو دليل مستقل. وبدون ذلك، فإن اختيار الناتج الأكثر قبولا يمكن أن يشفر توقعات المحقق بدلا من تحديد ما يقصده المنتج.
مثال عملي: اختبر قيمة create_at ضمن كلتا الوحدتين الصريحتين
يبدأ الإصلاح الدائم عند الحدود: قم بتحليل وحدة المصدر الموثقة، وقم بالتحويل مرة واحدة بالضبط واكشف عن قيمة داخلية مكتوبة أو مسماة بوضوح. يجب أن تحافظ أوصاف المخطط والأمثلة والعملاء الذين تم إنشاؤهم على اللاحقة أو تنسيق التاريخ والوقت. يمكن للمراجع بعد ذلك اكتشاف الضرب الإضافي قبل وقت التشغيل.
أضف أداة انحدار بالمقياس الحقيقي وتوقع ISO ثابت. تجنب الاكتشاف التلقائي في رمز التطبيق عندما يكون لدى المنتج عقد؛ الاستدلال مخصص للتحقيق في البيانات القديمة غير المؤكدة. يقوم ToolAcre بتسمية الاختيار الذي تم اكتشافه بدقة بحيث لا يمكن للتخمين أن يتنكر على أنه بيانات تعريف مضمونة.
ما لا يغطيه هذا هو أخطاء المنطقة الزمنية، التي تغير التاريخ بالساعات بدلاً من العقود
عادةً ما يؤدي خطأ المنطقة الزمنية إلى تغيير العرض بالساعات وقد يتجاوز يومًا تقويميًا واحدًا. عامل الخطأ 1,000 يغير عقودًا أو آلاف السنين. يؤدي خلط التشخيصات إلى تشجيع تعديلات الإزاحة حول القيمة التي يكون مقياسها خاطئًا بالفعل. تحقق من الوحدة قبل فحص التنسيق المحلي.
وبالمثل، يمكن أن يظل أصل العصر الخاطئ غير منطقي في كل من الثواني والميلي ثانية. إذا لم يتطابق أي من التفسيرين مع أي حدث معروف، فتوقف عن التبديل وتحقق من المنتج. المحول يضيق الفرضيات. لا يثبت أن كل عدد صحيح كبير هو وقت يونكس.
إذا كانت السنة معقولة ولكن يتم إزاحة الساعة باستمرار، فتحقق من عرض المنطقة. يؤدي الاحتفاظ بمقاييس الأعراض منفصلة إلى تقصير المسار من لقطة الشاشة إلى السبب الجذري.
الوجبات الجاهزة: الوحدة الخاطئة هي قرن خاطئ - وكيف تتيح لك الوحدة المذكورة في محول الطابع الزمني Unix اختبار كلا القراءتين في لحظة
إن الوحدة الخاطئة ليست بيانات وصفية تجميلية، بل إنها تغير لحظة بلحظة. تعامل مع 1970- الشاشات الثقيلة والسنوات البعيدة بشكل غير معقول كإشارات لفحص التماس بين المنتج والمستهلك. تشكل القيمة وعقد الوحدة والحدث المعلوم دليلا من ثلاثة أجزاء أقوى من التاريخ المعقول في الظاهر.
استخدم المحول لمقارنة القراءات الصريحة، ثم قم بتشفير المقياس المختار في الأسماء والأنواع والاختبارات. الهدف ليس تعليم البرمجيات كيفية التخمين بشكل أكثر ذكاءً. إنه لإزالة التخمين من المسار الذي ينشئ التواريخ للمستخدمين.
يمكن لمراجعة الكود بعد ذلك أن تطرح سؤالاً محددًا عند كل حد: ما هي الوحدة التي تدخل، وما هي الوحدة التي تخرج؟ وهذا أكثر موثوقية من التعرف على عدد معين من الأرقام.