Moment: يتم إرجاع رقم الأسبوع الخطأ من وظيفة "week ()"

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

وصف المشكلة وخطوات إعادة الإنتاج:
عند إنشاء تاريخ ، على سبيل المثال [2018, 11, 29] ، وأداء وظيفة week تكون النتيجة 52 ، لكن لـ [2018, 11, 30] و 31 بالإضافة إلى أنه يُرجع 1 . النتيجة المتوقعة هي 52 .

مثال

const a = moment([2018, 11, 29]);
console.log('a', a.year(), a.week());
//a 2018 52

const b = moment([2018, 11, 30]);
console.log('b', b.year(), b.week());
//b 2018 1

مثال حي jsbin

بيئة:
Safari 11.1.2 on OSX

معلومات أخرى قد تكون مفيدة:

"Thu Jul 19 2018 16:52:11 GMT+0200 (CEST)"
"7/19/2018, 4:52:11 PM"
-120
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15"
"2.14.1"

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

أعتقد أنه من المحتمل أن يكون لديك توقع لكيفية عمل ترقيم الأسبوع الذي يختلف عن الممارسة المعمول بها.

على سبيل المثال ، تعتقد أن الأول من كانون الثاني (يناير) يكون دائمًا في الأسبوع الأول ، وأن الحادي والثلاثين من كانون الأول (ديسمبر) يكون دائمًا في الأسبوع 52/53 - ولكي نكون منصفين ، تعرض بعض تقاويم الحائط ترقيمًا مثل هذا الأسبوع.

عندما يتعلق الأمر بتوحيد أرقام الأسبوع ، فإن الأفضل هو التأكد من أن الأسبوع يحتوي دائمًا على 7 أيام. بالنسبة لمعيار ISO: تبدأ الأسابيع من الاثنين إلى الأحد ، ويحتوي الأسبوع الأول على أول خميس من العام. مما يعني أن الاثنين - الأربعاء من الأسبوع الأول _مايو_ يقع في العام السابق. (سيحدث هذا في 2019/2020: من 29 إلى 31 ديسمبر 2019 تعتبر جزءًا من الأسبوع 1 من 2020)

أنت لا تستخدم طرق ISO ( isoWeek() / isoWeekYear() ) ، لذا فأنت تعتمد على تعريف الأسبوع الخاص بك ، والذي يبدأ من الأحد إلى السبت.

30 كانون الأول (ديسمبر) 2018 هو يوم الأحد ، وأول يوم من أيام الأسبوع في منطقتك. يقع يومان فقط من ذلك الأسبوع في 2018 ، والباقي في 2019. تُستخدم قواعد لغتك لتقرير ما إذا كان هذا الأسبوع (جميع الأيام السبعة) يُصنف على أنه 2018 الأسبوع 53 أو 2019 الأسبوع 1. في حالتك ، لقد قالوا 2019 الأسبوع 1.

ال 5 كومينتر

نواجه نفس المشكلة.
console.log(moment("2018-w15", "YYYY-[w]WW").add(38, "weeks").format("YYYY-[w]WW"))
يظهر 2018-w01

@ numen31337 ربما تريد استخدام weekYear () بدلاً من year()

Blapi WW هو أسبوع ISO ، لذلك تحتاج على الأرجح إلى استخدام GGGG بدلاً من YYYY عند التنسيق ( GGGG هو أسبوع ISO "سنة" )

سأوضح هذا قليلاً ، إليك رمز بالتواريخ والمخرجات ذات الصلة:

const a = moment([2018, 11, 29]);
console.log(
            `a year: ${a.year()}`,  //a year: 2018
            `a month: ${a.month()}`, //a month: 11
            `a date: ${a.date()}`, //a date: 29
            `a week: ${a.week()}`, //a week: 52
            `a weekYear: ${a.weekYear()}`, //a weekYear: 2018
);

const b = moment([2018, 11, 30]);
console.log(
            `b year: ${b.year()}`, //b year: 2018
            `b month: ${b.month()}`, //b month: 11
            `b date: ${b.date()}`, //b date: 30
            `b week: ${b.week()}`, //b week: 1 <=== Why 1?
            `b weekYear: ${b.weekYear()}`, //b weekYear: 2019 <=== Why 2019?
);

المشكلة بالنسبة لي هي أن week مقابل 2018, 11, 30 يُرجع 1 بدلاً من 52 . ربما أسأت فهم بعض مفاهيم هذه المكتبة؟ على المدى الطويل ، كانت مهمتي هي حساب عدد أسابيع التقويم بين تاريخين وقد قمت بذلك باستخدام الحل البديل التالي:

const fromDateStartWeek = fromDate.startOf('week');
const toDateStartWeek = toDate.startOf('week');
return toDateStartWeek.diff(fromDateStartWeek, 'weeks');

لكن ما زلت أتساءل عن هذه الوظيفة week . هل هذا خطأ أم أفتقد شيئًا؟ أنا قادم من التطوير الأصلي وجديد جدًا في جافا سكريبت. شكرا لك.

أعتقد أنه من المحتمل أن يكون لديك توقع لكيفية عمل ترقيم الأسبوع الذي يختلف عن الممارسة المعمول بها.

على سبيل المثال ، تعتقد أن الأول من كانون الثاني (يناير) يكون دائمًا في الأسبوع الأول ، وأن الحادي والثلاثين من كانون الأول (ديسمبر) يكون دائمًا في الأسبوع 52/53 - ولكي نكون منصفين ، تعرض بعض تقاويم الحائط ترقيمًا مثل هذا الأسبوع.

عندما يتعلق الأمر بتوحيد أرقام الأسبوع ، فإن الأفضل هو التأكد من أن الأسبوع يحتوي دائمًا على 7 أيام. بالنسبة لمعيار ISO: تبدأ الأسابيع من الاثنين إلى الأحد ، ويحتوي الأسبوع الأول على أول خميس من العام. مما يعني أن الاثنين - الأربعاء من الأسبوع الأول _مايو_ يقع في العام السابق. (سيحدث هذا في 2019/2020: من 29 إلى 31 ديسمبر 2019 تعتبر جزءًا من الأسبوع 1 من 2020)

أنت لا تستخدم طرق ISO ( isoWeek() / isoWeekYear() ) ، لذا فأنت تعتمد على تعريف الأسبوع الخاص بك ، والذي يبدأ من الأحد إلى السبت.

30 كانون الأول (ديسمبر) 2018 هو يوم الأحد ، وأول يوم من أيام الأسبوع في منطقتك. يقع يومان فقط من ذلك الأسبوع في 2018 ، والباقي في 2019. تُستخدم قواعد لغتك لتقرير ما إذا كان هذا الأسبوع (جميع الأيام السبعة) يُصنف على أنه 2018 الأسبوع 53 أو 2019 الأسبوع 1. في حالتك ، لقد قالوا 2019 الأسبوع 1.

شكرا على التوضيح. هذا حقا مفاجئ بالنسبة لي. أفتقد واجهة برمجة التطبيقات مثل من مكونات تاريخ تقويم Apple Calendar.current.dateComponents([.weekOfYear], from: sinceDay, to: targetDay) واستلام الفرق في الأسابيع الحقيقية من العام ، ليس فقط days / 7 .

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