ما هي تواريخ سلاسل التاريخ الصحيحة في JavaScript؟




string date (2)

عند استخدام new Date أو Date.parse new Date في JavaScript ، لا يمكنني تمرير تنسيقات التاريخ التعسفي. بناءً على التنسيق ، أحصل على تاريخ مختلف عما كنت أرغب فيه أو حتى Invalid Date بدلاً من كائن تاريخ. تعمل بعض تنسيقات التواريخ في متصفح واحد ولكن ليس في مستندات أخرى. فما هي تنسيقات التاريخ والوقت التي يجب استخدامها؟

اسئلة اضافية:

  • هل يدعم كل المتصفح نفس التنسيقات؟ كيف تتعامل Mozilla Firefox و Google Chrome و Microsoft Internet Explorer و Microsoft Edge و Apple Safari مع سلاسل وقت التاريخ؟ ماذا عن Node.js؟

  • هل يأخذ تنسيق التاريخ المحلي في الاعتبار؟ على سبيل المثال ، إذا كنت أعيش في سويسرا وكان تنسيق التاريخ 30.07.2018 ، new Date('30.07.2018') يمكنني استخدام new Date('30.07.2018') ؟

  • هل يأخذ المنطقة الزمنية المحلية في الاعتبار؟

  • كيف يمكنني الحصول على سلسلة وقت التاريخ من كائن تاريخ؟

  • كيف يمكنني اكتشاف سلاسل زمنية غير صالحة للتاريخ؟

  • كيف تتعامل مكتبات التاريخ مثل Moment.js مع سلاسل التاريخ؟

في حال لم تلاحظ ، أجبت على سؤالي الخاص ( why? ).


فما هي تنسيقات التاريخ والوقت التي يجب استخدامها؟

التوصية العامة هي عدم استخدام المحلل اللغوي المدمج على الإطلاق لأنه غير موثوق به ، وبالتالي فإن الإجابة على "should" هي "لا شيء". راجع لماذا تعطي Date.parse نتائج غير صحيحة؟

ومع ذلك ، وكما تقول str ، فمن المحتمل أن تستخدم التنسيق المحدد في ECMA-262 مع منطقة زمنية: YYYY-MM-DDTHH:mm:ss.sssZ أو YYYY-MM-DDTHH:mm:ss.sss±HH:mm ، don أثق بأي تنسيق آخر.

هل يدعم كل المتصفح نفس التنسيقات؟

لا.

كيف تتعامل Mozilla Firefox و Google Chrome و Microsoft Internet Explorer و Microsoft Edge و Apple Safari مع سلاسل وقت التاريخ؟

بشكل مختلف. أي شيء آخر غير التنسيق في ECMA-262 يعتمد على التنفيذ ، وهناك أخطاء في تحليل التنسيق ECMA-262.

ماذا عن Node.js؟

من المرجح مختلفة مرة أخرى ، انظر أعلاه.

هل يأخذ تنسيق التاريخ المحلي في الاعتبار؟ على سبيل المثال ، إذا كنت أعيش في سويسرا وكان تنسيق التاريخ 30.07.2018 ، فهل يمكنني استخدام تاريخ جديد ('30 .07.2018 ')؟

يمكن. نظرًا لأنه ليس التنسيق القياسي ، يعتمد التحليل على التنفيذ ، لذلك ربما ، ربما لا.

هل يأخذ المنطقة الزمنية المحلية في الاعتبار؟

يستخدم إزاحة المنطقة الزمنية للمضيف حيث يتم تحليل السلسلة على أنها محلية ولإنشاء السلسلة المعروضة باستخدام الأوقات المحلية. وإلا فإنه يستخدم UTC (وقيمة الوقت الداخلي هي UTC).

كيف يمكنني الحصول على سلسلة وقت التاريخ من كائن تاريخ؟

Date.prototype.toString() ، أو انظر أين يمكنني العثور على وثائق حول تنسيق تاريخ في JavaScript؟

كيف يمكنني اكتشاف سلاسل زمنية غير صالحة للتاريخ؟

واحدة من أول 3 إجابات here يجب الإجابة على ذلك.

كيف تتعامل مكتبات التاريخ مثل Moment.js مع سلاسل التاريخ؟

يقومون بتحليلها بناءً على تنسيق افتراضي أو تم توفيره. اقرأ المصدر (على سبيل المثال ، fecha.js عبارة عن محلل بسيط fecha.js مكتوب جيدًا ويسهل اتباعه).

ليس من الصعب كتابة المحلل اللغوي ، لكن محاولة تخمين تنسيق الإدخال (كما تفعل المحللون المدمجون) محفوف بالمخاطر وغير موثوق به وغير متناسق عبر عمليات التنفيذ. لذلك يجب أن يطلب المحلل اللغوي تقديم التنسيق ما لم تكن سلسلة الإدخال بالتنسيق الافتراضي للمحلل.

PS

هناك تغييرات على تنسيقات السلاسل التي يجب أن تدعمها التطبيقات للتحليل والتنسيق في ECMAScript 2019 (حاليًا في مسودة) ، لكنني أعتقد أن النصيحة العامة لتجنب المحلل اللغوي المدمج ستظل قائمة لبعض الوقت حتى الآن.


الأساسيات

يدعم JavaScript رسميًا تبسيط تنسيق ISO 8601 Extended. التنسيق كما يلي: YYYY-MM-DDTHH:mm:ss.sssZ . الحرف T هو فاصل التاريخ / الوقت و Z هو إزاحة المنطقة الزمنية المحددة كـ Z (بالتوقيت العالمي المنسق (UTC)) أو إما + أو - متبوعة بتعبير زمني HH:mm . يمكن حذف بعض الأجزاء (مثل الوقت) من هذا التنسيق.

لاحظ أنه يجب أن تحتوي السنوات على أربعة أرقام على الأقل ، ويجب أن يكون لشهر / يوم / ساعات / دقيقة / ثانية رقمان بالضبط ، ويجب أن يكون عدد المللي ثانية ثلاثة أرقام بالضبط. على سبيل المثال ، 99-1-1 ليس سلسلة تاريخ صالحة.

فيما يلي بعض أمثلة سلاسل التاريخ (الوقت) الصحيحة:

  • 2018-12-30
  • 2018-12-30T20:59
  • 2018-12-30T20:59:00
  • 2018-12-30T20:59:00.000Z
  • 2018-12-30T20:59:00.000+01:00
  • 2018-12-30T20:59:00.000-01:00

عند حذف إزاحة المنطقة الزمنية ، يتم تفسير أوقات التاريخ على أنها التوقيت المحلي للمستخدم. عند حذف الوقت كليًا ، يتم تفسير التواريخ على أنها UTC.

هام : تدعم جميع المتصفحات والتطبيقات الحديثة والقديمة بشكل معقول تنسيق وقت التاريخ الكامل وفقًا للمواصفات. ومع ذلك ، هناك اختلافات في معالجة سلاسل التاريخ (الوقت) بدون منطقة زمنية (راجع "إزاحة منطقة التوقيت المفقودة" أدناه للحصول على التفاصيل). يجب عدم استخدام سلاسل وقت التاريخ دون منطقة زمنية (الحالة 2018). بدلاً من ذلك ، قم بتمرير الطابع الزمني لليونيكس بالميللي ثانية أو الوسائط المستقلة لأجزاء مختلفة من التاريخ إلى مُنشئ Date .

تدعم معظم المستعرضات أيضًا بعض التنسيقات الأخرى ولكنها غير محددة ، وبالتالي لا تعمل في جميع المتصفحات بنفس الطريقة. على كل حال ، يجب عليك فقط استخدام تنسيقات سلسلة وقت التاريخ الموضحة أعلاه. قد ينقسم كل تنسيق آخر إلى متصفحات أخرى أو حتى في إصدارات أخرى من نفس المتصفح.

إذا قمت بتشغيل إلى " Invalid Date بدلاً من كائن "تاريخ" ، فمن المحتمل أنك تستخدم سلسلة زمنية غير صالحة للتاريخ.

والآن مع مزيد من التفاصيل قليلا.

تاريخ الوقت تنسيق سلسلة

يدعم ECMAScript (المواصفات التي تنفذها لغة JavaScript) سلاسل التاريخ في new Date ( specification ) و Date.parse ( specification ) منذ بدايتها. ومع ذلك ، فإن الإصدارات الأولى لم تحدد في الواقع تنسيق وقت التاريخ. تغير هذا في عام 2009 عندما تم تقديم ES5 مع تحديد تنسيق وقت التاريخ.

أساسيات

تحدد ECMAScript تنسيق سلسلة وقت التاريخ باعتباره تبسيطًا لتنسيق ISO 8601 Extended . التنسيق كما يلي: YYYY-MM-DDTHH:mm:ss.sssZ .

  • YYYY هي الأرقام العشرية من عام 0000 إلى 9999 في التقويم الميلادي.
  • - (الواصلة) يظهر حرفيًا مرتين في السلسلة.
  • MM هو شهر السنة من 01 (يناير) إلى 12 (ديسمبر).
  • DD هو يوم الشهر من 01 إلى 31.
  • يظهر T حرفيًا في السلسلة ، للإشارة إلى بداية عنصر الوقت.
  • HH هو عدد الساعات الكاملة التي انقضت منذ منتصف الليل كرقمين عشريين من 00 إلى 24.
  • : (القولون) يظهر حرفيا مرتين في السلسلة.
  • mm هو عدد الدقائق الكاملة منذ بداية الساعة كرقمين عشريين من 00 إلى 59.
  • ss هو عدد الثواني الكاملة منذ بداية الدقيقة كرقمين عشريين من 00 إلى 59.
  • . (نقطة) يظهر حرفيا في السلسلة.
  • sss هو عدد المللي ثانية كاملة منذ بداية الثانية بثلاثة أرقام عشرية.
  • Z هي إزاحة المنطقة الزمنية المحددة كـ "Z" (من أجل UTC) أو "+" أو "-" متبوعة بتعبير زمني HH:mm

لم يتم تحديد تنسيقات وقت التاريخ الأخرى. لا تأخذ ECMAScript أي تنسيقات زمنية للتاريخ المحلي للمستخدم في الاعتبار ، مما يعني أنه لا يمكنك استخدام تنسيقات وقت التاريخ الخاصة بالبلد أو المنطقة.

تشير المواصفات أيضًا mentions أنه "إذا لم تتوافق السلسلة مع التنسيق [المحدد] ، فقد ترجع الوظيفة إلى أي استدلاليات خاصة بالتطبيق أو تنسيقات تاريخ خاصة بالتطبيق" مما قد يؤدي إلى تواريخ مختلفة في متصفحات مختلفة.

نماذج التاريخ والوقت القصير

تتضمن المواصفات أيضًا تنسيقات أقصر كما يلي.

يتضمن هذا التنسيق أشكال التاريخ فقط:

  • YYYY
  • YYYY-MM
  • YYYY-MM-DD

يتضمن أيضًا نماذج "وقت - التاريخ" التي تتكون من أحد نماذج التاريخ أعلاه فقط متبوعة فورًا بأحد نماذج الوقت التالية مع إزاحة المنطقة الزمنية الاختيارية الملحقة:

  • THH:mm
  • THH:mm:ss
  • THH:mm:ss.sss

القيم الاحتياطية

[...] إذا كانت حقول MM أو DD غائبة ، يتم استخدام "01" كقيمة. إذا كانت الحقول HH أو mm أو ss غائبة ، يتم استخدام "00" كقيمة وقيمة حقل sss الغائب هي "000" . عند غياب إزاحة المنطقة الزمنية ، يتم تفسير نماذج التاريخ فقط على أنها وقت UTC ويتم تفسير نماذج الوقت والتاريخ كوقت محلي.

راجع "إزاحة المنطقة الزمنية المفقودة" أدناه للحصول على مزيد من المعلومات حول دعم المتصفح الذي ينقصه.

قيم خارج الحدود

القيم غير القانونية (خارج الحدود وكذلك أخطاء بناء الجملة) في سلسلة التنسيق تعني أن سلسلة التنسيق ليست نسخة صالحة لهذا التنسيق.

على سبيل المثال ، new Date('2018-01-32') new Date('2018-02-29') سيؤدي إلى Invalid Date .

سنوات طويلة

يحدد تنسيق وقت التاريخ الخاص بـ ECMAScript أيضًا السنوات الممتدة التي تبلغ قيمتها ستة أرقام. مثال على هذا التنسيق لسلسلة العام الممتد يشبه +287396-10-12T08:59:00.992Z والذي يشير إلى تاريخ في العام 287396 م.

تاريخ API

تحدد ECMAScript نطاقًا واسعًا من خصائص كائن التاريخ . نظرًا لكائن تاريخ صالح ، يمكنك استخدام Date.prototype.toISOString() للحصول على سلسلة زمنية صالحة للتاريخ. لاحظ أن المنطقة الزمنية هي دائمًا UTC.

new Date().toISOString() // "2018-08-05T20:19:50.905Z"

من الممكن أيضًا اكتشاف ما إذا كان كائن التاريخ صالحًا أم Invalid Date باستخدام الوظيفة التالية.

function isValidDate(d) {
  return d instanceof Date && !isNaN(d);
}

يمكن العثور على المصدر والمزيد من المعلومات في اكتشاف "تاريخ غير صالح" لمثيل التاريخ في JavaScript .

أمثلة

صالح تنسيق التاريخ الوقت

جميع تنسيقات وقت التاريخ التالية صالحة وفقًا للمواصفات ويجب أن تعمل في كل مستعرض أو Node.js أو أي تطبيق آخر يدعم ES2016 أو أعلى.

2018
2018-01
2018-01-01
2018-01-01T00:00
2018-01-01T00:00:00
2018-01-01T00:00:00.000
2018-01-01T00:00:00.000Z
2018-01-01T00:00:00.000+01:00
2018-01-01T00:00:00.000-01:00
+002018-01-01T00:00:00.000+01:00

تنسيقات وقت التاريخ غير صالحة

لاحظ أن الأمثلة التالية غير صالحة وفقًا للمواصفات. ومع ذلك ، هذا لا يعني أنه لا يوجد مستعرض أو تطبيق آخر يفسرها حتى الآن. يرجى عدم استخدام أي من تنسيقات وقت التاريخ أدناه لأنها غير قياسية وقد تفشل في بعض المتصفحات أو إصدارات المتصفح.

2018-1-1 // month and date must be two digits
2018-01-01T0:0:0.0 // hour/minute/second must be two digits, millisecond must be three digits
2018-01-01 00:00 // whitespace must be "T" instead
2018-01-01T00 // shortest time part must have format HH:mm
2018-01-01T00:00:00.000+01 // time zone must have format HH:mm

دعم المتصفح

اليوم ، يدعم كل مستعرض حديث وقديم بشكل معقول تنسيق وقت التاريخ الذي تم تقديمه بمواصفات ES5 في عام 2009. ومع ذلك ، حتى اليوم (الحالة 2018) هناك تطبيقات مختلفة لسلاسل وقت التاريخ دون منطقة زمنية (راجع "إزاحة المنطقة الزمنية المفقودة" " أدناه). إذا كنت بحاجة إلى دعم المتصفحات القديمة أو استخدام السلاسل بدون منطقة زمنية ، يجب ألا تستخدم سلاسل وقت التاريخ . بدلاً من ذلك ، مرر عددًا من المللي ثانية منذ 1 يناير 1970 ، 00:00:00 UTC أو وسيطين أو أكثر يمثلان أجزاء التاريخ المختلفة إلى مُنشئ Date .

إزاحة المنطقة الزمنية المفقودة

تنص ES5.1 incorrectly على أن قيمة إزاحة المنطقة الزمنية الغائبة هي “Z” التي تتعارض مع ISO 8601. تم إصلاح هذا الخطأ في ES6 (ES2015) وتم تمديده في ES2016 (انظر "التغييرات في مواصفات ECMAScript" أدناه). اعتبارًا من ES2016 ، يتم تحليل سلاسل وقت التاريخ دون منطقة زمنية بالتوقيت المحلي بينما يتم تحليل سلاسل التاريخ فقط كتوقيت UTC.

وفقًا لهذه الإجابة ، لم تنفذ بعض التطبيقات مطلقًا السلوك المحدد في ES5.1. واحد منهم يبدو أن موزيلا فايرفوكس. المتصفحات الأخرى التي يبدو أنها متوافقة مع مواصفات ES2016 (والإصدارات الأحدث) هي Google Chrome 65+ و Microsoft Internet Explorer 11 و Microsoft Edge. الإصدار الحالي من Apple Safari (11.1.2) غير متوافق لأنه يوزع عن طريق الخطأ سلاسل زمنية للتاريخ دون منطقة زمنية (مثل 2018-01-01T00:00 ) 2018-01-01T00:00 UTC بدلاً من التوقيت المحلي.

تنسيقات التاريخ القديم

قدمت ES5 مواصفات لسلاسل زمنية التاريخ في عام 2009. وقبل ذلك ، لم تكن هناك تنسيقات محددة تدعمها جميع المتصفحات. نتيجةً لذلك ، أضاف كل بائع متصفح دعمًا للتنسيقات المختلفة التي لم تنجح غالبًا عبر المتصفحات المختلفة (والإصدارات). للحصول على مثال صغير عن التاريخ القديم ، راجع date-formats .

لا تزال معظم المتصفحات تدعم هذه التنسيقات القديمة من أجل عدم كسر التوافق مع المواقع القديمة. لكن ليس من الآمن الاعتماد على تلك التنسيقات غير القياسية لأنها قد تكون غير متسقة أو تتم إزالتها في أي وقت.

Date.prototype.toString() و Date.prototype.toUTCString()

حدد ES2018 لأول مرة تنسيق التاريخ الذي تم إرجاعه بواسطة Date.prototype.toString() و Date.prototype.toUTCString() . قبل ذلك بالفعل ، تطلبت مواصفات ECMA منشئ Date و Date.parse تحليل التنسيقات التي تم إرجاعها بواسطة تلك الطرق بشكل صحيح (على الرغم من أنها لم تحدد تنسيقًا قبل عام 2018).

قد تبدو قيمة إرجاع مثال Date.prototype.toString() كما يلي:

Sun Feb 03 2019 14:27:49 GMT+0100 (Central European Standard Time)

لاحظ أن اسم المنطقة الزمنية داخل الأقواس اختياري وأن الاسم الدقيق "يعتمد على التنفيذ".

Date.prototype.toUTCString() تاريخًا بتنسيق مشابه Date.prototype.toString() ولكن بإزاحة منطقة زمنية صفرية. قد يبدو تنسيق مثال كالتالي:

Sun, 03 Feb 2019 13:27:49 GMT

لاحظ أن هناك فاصلة , بعد أن يتم عكس شهر الأسبوع والشهر مقارنةً بـ Date.prototype.toUTCString() .

نظرًا لأنه تم تحديد هذه التنسيقات فقط في عام 2018 ، يجب ألا تعتمد عليها في العمل على قدم المساواة في تطبيقات مختلفة (وخاصة المتصفحات القديمة).

نود.جي إس

يعمل Node.js على محرك V8 JavaScript الذي يستخدم أيضًا في Google Chrome. لذلك تنطبق نفس المواصفات المتعلقة بتنسيق سلسلة وقت التاريخ. نظرًا لأن الشفرة تعمل في الخلفية ، فإن الوقت المحلي للمستخدم لا يؤثر على المناطق الزمنية ولكن فقط الإعدادات الموجودة على الخادم. تستخدم معظم النظام الأساسي كموفر خدمة (PaaS) الذي يستضيف تطبيقات Node.js UTC كمنطقة زمنية افتراضية.

مكتبات وقت التاريخ

Moment.js

Moment.js هي مكتبة شائعة جدًا للمساعدة في معالجة التواريخ في JavaScript كما أنها تدعم تنسيقات أكثر مما تحدده ECMAScript. بالإضافة إلى ذلك ، يدعم Moment.js أيضًا إنشاء كائنات تاريخ بناءً على سلسلة وتنسيق اعتباطي .

Luxon

يدعم Luxon parsing Luxon ISO 8601 و HTTP و RFC2822 و SQL والتنسيق التعسفي. ولكن فقط باستخدام وظائف مختلفة لتنسيقات وقت التاريخ المختلفة.

التغييرات في مواصفات ECMAScript

قائمة التغييرات الملحوظة في مواصفات ECMAScript فيما يتعلق بتنسيقات سلسلة وقت التاريخ.

التغييرات في ES2018

يقدم تحديدًا لتنسيقات التاريخ التي يتم إرجاعها بواسطة Date.prototype.toString() و Date.prototype.toUTCString() .

التغييرات في ES2017

لا توجد تغييرات ملحوظة.

التغييرات في ES2016

في حالة غياب إزاحة المنطقة الزمنية ، يتم تفسير وقت التاريخ على أنه التوقيت المحلي.

عند غياب إزاحة المنطقة الزمنية ، يتم تفسير نماذج التاريخ فقط على أنها وقت UTC ويتم تفسير نماذج الوقت والتاريخ كوقت محلي.

التغييرات في ES6 (ES2015)

قيمة إزاحة المنطقة الزمنية الغائبة هي “Z” .

في حالة غياب إزاحة المنطقة الزمنية ، يتم تفسير وقت التاريخ على أنه التوقيت المحلي.

من incorrectly :

في حالة عدم وجود إزاحة المنطقة الزمنية ، يتم استخدام المنطقة الزمنية المحلية. ذكر الإصدار 5.1 بشكل غير صحيح أنه يجب تفسير منطقة زمنية مفقودة على أنها "z" .

راجع تنسيق وقت سلسلة التاريخ: فرق التوقيت الافتراضي من ES5 غير متوافق مع الويب للحصول على مزيد من التفاصيل حول هذا التغيير.

التغييرات في ES5.1

إذا كانت حقول MM أو DD غائبة ، فسيتم استخدام “01” كقيمة. إذا كانت الحقول HH أو mm أو ss غائبة ، فسيتم استخدام “00” كقيمة وقيمة حقل sss الغائب هي “000” . قيمة إزاحة المنطقة الزمنية الغائبة هي “Z” .

التغييرات في ES5

المقدمة الأولى لتنسيق سلسلة وقت التاريخ لمواصفات ECMAScript.

يعرّف ECMAScript تنسيق تبادل السلسلة لمرات التاريخ بناءً على تبسيط تنسيق ISO 8601 Extended. التنسيق كما يلي: YYYY-MM-DDTHH:mm:ss.sssZ

يقدم أيضًا Date.prototype.toISOString() والذي يقوم بإرجاع سلسلة وقت التاريخ بالتنسيق المحدد.

التغييرات في ES3

Deprecates Date.prototype.toGMTString() واستبدالها بـ Date.parse(x.toUTCString()) في القسم الذي يشير إلى أن التنسيق الذي يتم إرجاعه بواسطة هذه الطرق يجب أن يكون قابل للتحليل بشكل صحيح عن طريق التضمين من Date.parse . لاحظ أن التنسيق الذي تم إرجاعه بواسطة Date.parse(x.toUTCString()) "يعتمد على التطبيق".

التغييرات في ES2

لا توجد تغييرات ملحوظة.

المواصفات الأولية: ES1

قدم ES1 سلاسل وقت التاريخ ليتم استخدامها في new Date(value) و Date.parse(value) . ومع ذلك ، لم يحدد تنسيق التاريخ (الوقت) الفعلي ، بل ينص على ذلك

[...] القيمة التي تنتجها Date.parse تعتمد على التنفيذ [...]

المواصفات كما يذكر ذلك

إذا كانت x عبارة عن كائن Date [...] ، فيجب أن تنتج كل التعبيرات التالية نفس القيمة الرقمية في هذا التطبيق [...]:

  • [...]
  • Date.parse(x.toString())
  • Date.parse(x.toGMTString())

ومع ذلك ، تم تحديد القيمة التي تم إرجاعها لكل من Date.prototype.toString() و Date.prototype.toGMTString() على أنها "تابعة للتطبيق".







time