Moment: هل هي طريقة لإضافة. () أو .subtract () القيم العائمة؟

تم إنشاؤها على ٢٠ يونيو ٢٠١٥  ·  3تعليقات  ·  مصدر: moment/moment

moment().add(1, "months") // >> Mon Jul 20 2015 13:36:12 GMT+0200
moment().add(1.9, "months") // >> Mon Jul 20 2015 13:36:12 GMT+0200
// Excpected: Mon Aug 17 2015 09:34:37 GMT+0200

في الوقت الحالي ، علي أن أفعل:

var duration = moment.duration(1.9, "months"); 
var ms = duration.asMilliseconds();
var date = moment().add(ms, "ms");

لماذا لا يمكن لهذه الطرق إضافة أو استبدال القيم العائمة؟

التعليق الأكثر فائدة

هذا حسب التصميم ، ولكن ربما يمكن شرحه بشكل أفضل في الوثائق.

يمكنك استخدام الكسور العشرية عند إضافة أو طرح الساعات أو الدقائق أو الثواني أو المللي ثانية ، لكن لا يمكنك تقسيم الأيام أو المكونات الأكبر.

والسبب هو أن هناك فرقًا منطقيًا بين رياضيات الوقت والتاريخ.

تفترض رياضيات الوقت مقياسًا زمنيًا خطيًا ، ما عليك سوى زيادة الطابع الزمني المستند إلى التوقيت العالمي المنسق أو إنقاصه. هذا يعالج انتقالات التوقيت الصيفي في الوقت الحقيقي. على سبيل المثال ، بالنسبة لمعظم الأماكن في الولايات المتحدة ، سيكون 2015-03-08T01:00:00 بالإضافة إلى ساعة واحدة 2015-03-08T03:00:00 لأنه تم تخطي الساعة من 2:00 إلى 3:00 لانتقال التوقيت الصيفي.

لا تستخدم رياضيات التاريخ مقياسًا زمنيًا خطيًا ، ولكنها تستخدم التواريخ الموجودة في التقويم. باستخدام نفس المثال ، سيكون 2015-03-08T01:00:00 plus one _day_ 2015-03-09T01:00:00 ، على الرغم من مرور 23 ساعة فقط. لذلك ، فإن "اليوم" هو هذا السياق ليس مقدارًا ثابتًا من الوقت ، وبالتالي فإن تقسيمه إلى أجزاء فرعية سيكون أمرًا غير منطقي. (هل سيكون نصف يوم بعد 12 ساعة ، أو بعد 11.5 ساعة في هذا اليوم؟)

حتى بدون التوقيت الصيفي ، ضع في اعتبارك أنه ليست كل الشهور هي 30 يومًا ، وليست كل السنوات هي 365 يومًا. "إضافة" سنة ، لا تعني حقًا "إضافة 365 يومًا" ، بل تعني "تقدم بالمركز في التقويم إلى نفس الشهر واليوم من العام التالي". هذا يخلق بعض الالتباسات ، مثل عند إضافة سنة واحدة إلى 29 فبراير في سنة كبيسة وتنتهي في سنة غير كبيسة. اخترنا الهبوط في 28 فبراير ، لكن الهبوط في الأول من مارس سيكون صالحًا بنفس القدر.

كمثال آخر ، ضع في اعتبارك أن 31 أغسطس زائد شهر واحد ، ناقص شهر واحد ، هو 30 أغسطس.

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

للتفكير في الأمر بطريقة أخرى ، ماذا تتوقع أن تكون نتيجة منتصف ليل 15 يونيو + 1.5 شهرًا؟ يمكن أن يقوم الإنسان بأي مما يلي:

  • 2015-06-15T00:00 + (0.5 * 30 يومًا في يونيو) = 2015-06-30T00:00 + (شهر واحد = 30 يومًا) = 2015-07-30T00:00
  • 2015-06-15T00:00 + (0.5 * 30 يومًا في يونيو) = 2015-06-30T00:00 + (شهر واحد = 31 يومًا) = 2015-07-31T00:00
  • 2015-06-15T00:00 + شهر واحد = 2015-07-15T00:00 + (0.5 * 31 يومًا في يوليو) = 2015-07-30T12:00
  • 2015-06-15T00:00 + [(61 يومًا في يونيو ويوليو / 2 = 30.5 متوسط ​​الأيام في هذه الأشهر) * 1.5 شهر = 45.75 يومًا] = 2015-07-30T18:00

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

ال 3 كومينتر

هذا حسب التصميم ، ولكن ربما يمكن شرحه بشكل أفضل في الوثائق.

يمكنك استخدام الكسور العشرية عند إضافة أو طرح الساعات أو الدقائق أو الثواني أو المللي ثانية ، لكن لا يمكنك تقسيم الأيام أو المكونات الأكبر.

والسبب هو أن هناك فرقًا منطقيًا بين رياضيات الوقت والتاريخ.

تفترض رياضيات الوقت مقياسًا زمنيًا خطيًا ، ما عليك سوى زيادة الطابع الزمني المستند إلى التوقيت العالمي المنسق أو إنقاصه. هذا يعالج انتقالات التوقيت الصيفي في الوقت الحقيقي. على سبيل المثال ، بالنسبة لمعظم الأماكن في الولايات المتحدة ، سيكون 2015-03-08T01:00:00 بالإضافة إلى ساعة واحدة 2015-03-08T03:00:00 لأنه تم تخطي الساعة من 2:00 إلى 3:00 لانتقال التوقيت الصيفي.

لا تستخدم رياضيات التاريخ مقياسًا زمنيًا خطيًا ، ولكنها تستخدم التواريخ الموجودة في التقويم. باستخدام نفس المثال ، سيكون 2015-03-08T01:00:00 plus one _day_ 2015-03-09T01:00:00 ، على الرغم من مرور 23 ساعة فقط. لذلك ، فإن "اليوم" هو هذا السياق ليس مقدارًا ثابتًا من الوقت ، وبالتالي فإن تقسيمه إلى أجزاء فرعية سيكون أمرًا غير منطقي. (هل سيكون نصف يوم بعد 12 ساعة ، أو بعد 11.5 ساعة في هذا اليوم؟)

حتى بدون التوقيت الصيفي ، ضع في اعتبارك أنه ليست كل الشهور هي 30 يومًا ، وليست كل السنوات هي 365 يومًا. "إضافة" سنة ، لا تعني حقًا "إضافة 365 يومًا" ، بل تعني "تقدم بالمركز في التقويم إلى نفس الشهر واليوم من العام التالي". هذا يخلق بعض الالتباسات ، مثل عند إضافة سنة واحدة إلى 29 فبراير في سنة كبيسة وتنتهي في سنة غير كبيسة. اخترنا الهبوط في 28 فبراير ، لكن الهبوط في الأول من مارس سيكون صالحًا بنفس القدر.

كمثال آخر ، ضع في اعتبارك أن 31 أغسطس زائد شهر واحد ، ناقص شهر واحد ، هو 30 أغسطس.

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

للتفكير في الأمر بطريقة أخرى ، ماذا تتوقع أن تكون نتيجة منتصف ليل 15 يونيو + 1.5 شهرًا؟ يمكن أن يقوم الإنسان بأي مما يلي:

  • 2015-06-15T00:00 + (0.5 * 30 يومًا في يونيو) = 2015-06-30T00:00 + (شهر واحد = 30 يومًا) = 2015-07-30T00:00
  • 2015-06-15T00:00 + (0.5 * 30 يومًا في يونيو) = 2015-06-30T00:00 + (شهر واحد = 31 يومًا) = 2015-07-31T00:00
  • 2015-06-15T00:00 + شهر واحد = 2015-07-15T00:00 + (0.5 * 31 يومًا في يوليو) = 2015-07-30T12:00
  • 2015-06-15T00:00 + [(61 يومًا في يونيو ويوليو / 2 = 30.5 متوسط ​​الأيام في هذه الأشهر) * 1.5 شهر = 45.75 يومًا] = 2015-07-30T18:00

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

شكرًا جزيلاً لك على الوقت الذي قضيته في كتابة هذه الإجابة التفصيلية للغاية. أنا أفهم بشكل أفضل المنطق الكامن وراء تشغيل هذه الوظائف.

لم أستطع مقاومة نفسي لشكر مات ، لقد تجاوزت نفس المشكلة التي واجهها Delgan ، ورفيق! إجابتك كاملة جدا ، شكرا لك.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

benhathaway picture benhathaway  ·  3تعليقات

chitgoks picture chitgoks  ·  3تعليقات

dogukankotan picture dogukankotan  ·  3تعليقات

RobinvanderVliet picture RobinvanderVliet  ·  3تعليقات

tanepiper picture tanepiper  ·  3تعليقات