Moment: "weekOfYear" غير صحيح لبعض مجموعات dow / doy

تم إنشاؤها على ٢١ ديسمبر ٢٠١٤  ·  13تعليقات  ·  مصدر: moment/moment

يبدو أن خوارزمية حساب الأسبوع ليست عامة بما يكفي ، حيث يبدو أنها تتعامل مع مجموعات معينة من الداو / دو بشكل غير صحيح:

// see http://en.wikipedia.org/wiki/Seven-day_week#cite_ref-15
moment.locale(moment.locale(), { week: { dow: 6, doy: 1 } });
moment("2012-12-28", "YYYY-MM-DD").week(); // 51 -- should be 52?
moment("2012-12-29", "YYYY-MM-DD").week(); // 52 -- should be 1
moment("2013-01-01", "YYYY-MM-DD").week(); // 52 -- should be 1
moment("2013-01-08", "YYYY-MM-DD").week(); // 53 -- should be 2
moment("2013-01-11", "YYYY-MM-DD").week(); // 53 -- should be 2
moment("2013-01-12", "YYYY-MM-DD").week(); // 1 -- should be 3
moment().weeksInYear(2012); // 52

أفترض أن هناك شيئًا ما غير جيد في وظيفة weekOfYear ، إلا إذا كنت أفعل شيئًا خاطئًا؟

Bug

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

لا يمكنني شرح أسباب الطريقة ، وكيف يتم تعريف doy ، ولكن يمكنك تعيينه على 7 + dow - janX حيث janX هو العاشر من يناير الذي يجب أن ينتمي إلى الأسبوع رقم 1.

لذلك ، إذا كان الأول من كانون الثاني (يناير) يجب أن ينتمي إلى الأسبوع رقم 1 وكان يوم السبت هو اليوم الأول من الأسبوع ، فعندئذٍ doy = 7 + 6 - 1 = 12 . بالنسبة إلى ISO ، سيكون doy = 7 + 1 - 4 = 4 للولايات المتحدة سيكون doy = 7 + 0 - 1 = 6 .

ال 13 كومينتر

أي أفكار؟ يؤثر هذا على العديد من المناطق حيث لا يكون اليوم الأول من الأسبوع هو الأحد أو الاثنين. إذا تم التحقق من الخطأ ، فهل يجب أن أرسل طلب سحب لحساب weekOfYear ، أم أن هناك خططًا بالفعل لتصحيح الخوارزمية الحالية؟

يجب أن أعترف أن إعداد doy مربك للغاية. يعني { dow: 6, doy: 12 } أن الأسبوع يبدأ يوم السبت وأن الأسبوع 1 هو الأسبوع الذي يبدأ في الأول من يناير. إذا فهمت الأمر بشكل صحيح ، فإن {dow:6, doy: 1} يعني أن الأسبوع الأول بعيدًا يحتوي دائمًا على 26 ديسمبر.

لقد أضفت اختبارًا { dow: 6, doy: 12 } لطلب السحب.

هل تقصد { dow: 6, doy: 1 } ؟ أعتقد أن قيمة doy الأكبر من 7 ليس لها أي معنى حقيقي .. هل كان ذلك خطأ مطبعي؟

لا ، لقد قصدت {dow: 6, doy: 12} . لاحظ أن doy هو _ليس_ اليوم في شهر يناير أي الأسبوع الأول. {dow: 6, doy: 12} هو المعيار في الدول العربية - يبدأ الأسبوع يوم السبت والأسبوع الأول هو الأسبوع الذي يحتوي على 1 يناير.

لم يكن الخطأ في الواقع في حساب الأسبوع من التاريخ ، فقط في الاتجاه الآخر.

توقف ، إذا كان الأمر كذلك ، فقد أسيء فهم doy طوال الوقت ..

في الواقع ، وفقًا للمستندات localeData.firstDayOfYear() يمكن إرجاع أي عدد صحيح بين 0 و 15 ، لكن هذا يبدو غريبًا جدًا بالنسبة لي.

فقط لمساعدتي على الفهم ، هل يمكنك شرح سبب كون الرقم 12 وليس 1؟ وماذا يعني doy من 1 أو 4 في هذه الحالة؟ كيف بالضبط تعمل الرياضيات هنا؟ يبدو أنك تتمتع بفهم جيد لهذا ..

لقد وجدت تفسيرًا جيدًا ، مما يجعل الأمر أكثر وضوحًا ما هو doy ، على الرغم من أنني ما زلت لا أستطيع معرفة كيف يمكن أن يكون أكبر من 6 ..

icambron ، هل يمكنك أن تتناغم من فضلك؟ هل هناك رابط إلى مكان ما يشرح هذا بشكل كامل أكثر من المستندات الحالية؟

usmonster لقد مر وقت طويل منذ أن نظرت إلى هذا ، لكن من أعلى رأسي ... نعم ، لم أفهم ذلك أيضًا. آسف لا أستطيع أن أكون أكثر فائدة. كلما كتبت التفسير المرتبط ، كنت قد كتبت للتو مجموعة من تطبيق Moment للتعامل مع الأسابيع ، لذلك ربما فهمته في ذلك الوقت ، ولكن لا يبدو أن هذا التفسير يتوافق مع قيم doy > 6 ، لذلك .. .

لا يمكنني شرح أسباب الطريقة ، وكيف يتم تعريف doy ، ولكن يمكنك تعيينه على 7 + dow - janX حيث janX هو العاشر من يناير الذي يجب أن ينتمي إلى الأسبوع رقم 1.

لذلك ، إذا كان الأول من كانون الثاني (يناير) يجب أن ينتمي إلى الأسبوع رقم 1 وكان يوم السبت هو اليوم الأول من الأسبوع ، فعندئذٍ doy = 7 + 6 - 1 = 12 . بالنسبة إلى ISO ، سيكون doy = 7 + 1 - 4 = 4 للولايات المتحدة سيكون doy = 7 + 0 - 1 = 6 .

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

dow : 1, // Monday is the first day of the week.
doy : 7  // The week that contains Jan 1st is the first week of the year.

وفي ملف آخر:

dow : 6, // Saturday is the first day of the week.
doy : 12  // The week that contains Jan 1st is the first week of the year.

لذلك يبدو تقييمك للتنفيذ دقيقًا. ومع ذلك ، يبدو الأمر صعبًا ، كما لو أن الاختبارات تمت كتابتها لمطابقة تطبيق معطل.

هذا أمر محبط بشكل خاص لأن الشيء الأنظف الذي يجب القيام به كان مجرد إصلاح التطبيق بحيث يفعل ما هو بديهي (خذ " janX " الذي يجب أن يكون في الأسبوع الأول) ، ولكن إصلاحه الآن لن ' ر تكون متوافقة مع الإصدارات السابقة. قرف.

قد يكون البديل هو إهمال doy وتقديم خيار جديد لتهيئة الأسبوع ، مثل minDays أو dom ، لتحديد الحد الأدنى لعدد "أيام يناير" (1- 7) أن يكون في الأسبوع الأول من العام. سيؤدي هذا إلى تجاوز doy إذا تم تحديده عن طريق الخطأ.

أي أفكار؟

حسنًا ، بقدر ما أستطيع أن أقول ، لقد تم إعداد الكود لأسابيع iso ، ثم أساءنا استخدام الحقيقة وتأكدنا من أن الأرقام تجعلها تعمل.

إذا قمنا بتغيير الدلالات لتكون ذات مغزى أكبر للمستخدمين فقد يكون ذلك أفضل. ولكن يجب أن يكون متوافقًا مع الإصدارات السابقة (لذا فإن الأساليب الجديدة تكشف عن أرقام جديدة).

اعتبارًا من المثال الخاص بك ، يمكنك جعله يعمل إذا قمت بإضافة 7 عدة مرات إلى doy ، لأنه قريب من داو.

إغلاق هذا لصالح # 2336

مرحباichernev. :) بالعودة إلى هذا بعد عام ، ما زلت أؤيد تنفيذ المزيد من الدلالات ذات المعنى ، على الرغم من أنني متأكد تقريبًا من أنه ليس من الممكن القيام بشيء متوافق مع الإصدارات السابقة دون تغيير البنية أيضًا.

يمكنك جعلها تعمل إذا قمت بإضافة 7 عدة مرات إلى doy ، لأنه قريب من داو.

لست مقتنعًا بأن هذا هو الحال دائمًا .. على سبيل المثال ، لا يعني { dow: 0, doy: 6 } نفس الشيء قبل التغيير الدلالي المقترح وبعده. (لهذا السبب اقترحت إهمال doy لصالح اسم آخر.)

أين يمكنني البحث عن مزيد من التعليقات حول هذا؟ تم إغلاق هذه المشكلة بالذات ، على الرغم من أنه يمكنني نقل المحادثة إلى moment / momentjs.com # 279 أو فتح مشكلة جديدة إذا كان ذلك أكثر ملاءمة.

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

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