問題の説明と再現手順:
たとえば[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
環境:
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"
同じ問題が発生します。
console.log(moment("2018-w15", "YYYY-[w]WW").add(38, "weeks").format("YYYY-[w]WW"))
2018-w01
@ numen31337 year()
代わりにweekYear()を使用したいと思うかもしれません
@Blapi WW
はISO週であるため、フォーマット時にYYYY
ではなくGGGG
を使用する必要があります( 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
。 たぶん私はこのライブラリのいくつかの概念を誤解しましたか? 長期的には、私のタスクは2つの日付の間の暦週数を計算することでしたが、次の回避策でこれを実行しました。
const fromDateStartWeek = fromDate.startOf('week');
const toDateStartWeek = toDate.startOf('week');
return toDateStartWeek.diff(fromDateStartWeek, 'weeks');
しかし、私はまだこのweek
関数について疑問に思っています。 これはバグですか、それとも何かが恋しいですか? 私はネイティブ開発から来ており、JavaScriptにはまったく慣れていません。 ありがとうございました。
おそらく、確立された慣行とは異なる週の番号付けがどのように機能するかについての期待があると思います。
たとえば、1月1日は常に第1週であり、12月31日は常に第52/53週であると考えます。公平を期すために、一部の壁掛けカレンダーにはそのような週番号が表示されます。
週番号の標準化に関しては、週に常に7日が含まれるようにすることが優先されます。 ISO規格の場合:週は月曜日から日曜日まで実行され、第1週にはその年の最初の木曜日が含まれます。 これは、第1週の月曜日から水曜日が前年に該当する可能性があることを意味します。 (これは2019/2020に発生します:2019年12月29日から31日は2020年の第1週の一部と見なされます)
ISOメソッド( isoWeek()
/ isoWeekYear()
)を使用していないため、日曜日から土曜日まで実行されるロケールの週の定義に依存しています。
2018年12月30日は日曜日であり、お住まいの地域の週の最初の日です。 その週の2日だけが2018年になり、残りは2019年になります。ロケールのルールを使用して、その週(7日すべて)を2018週53または2019週1のどちらに分類するかを決定します。あなたの場合、彼らは2019週1と言いました。
ご説明ありがとうございます。 それは私にとって本当に驚くべきことです。 Apple Calendar dateComponents(_:from:to :)のようなAPIが本当に恋しいです。ここでは、特定のコンポーネント(私の場合はCalendar.current.dateComponents([.weekOfYear], from: sinceDay, to: targetDay)
で差分を要求し、その年の実際の週に差分を受け取ることができます。 days / 7
だけで
最も参考になるコメント
おそらく、確立された慣行とは異なる週の番号付けがどのように機能するかについての期待があると思います。
たとえば、1月1日は常に第1週であり、12月31日は常に第52/53週であると考えます。公平を期すために、一部の壁掛けカレンダーにはそのような週番号が表示されます。
週番号の標準化に関しては、週に常に7日が含まれるようにすることが優先されます。 ISO規格の場合:週は月曜日から日曜日まで実行され、第1週にはその年の最初の木曜日が含まれます。 これは、第1週の月曜日から水曜日が前年に該当する可能性があることを意味します。 (これは2019/2020に発生します:2019年12月29日から31日は2020年の第1週の一部と見なされます)
ISOメソッド(
isoWeek()
/isoWeekYear()
)を使用していないため、日曜日から土曜日まで実行されるロケールの週の定義に依存しています。2018年12月30日は日曜日であり、お住まいの地域の週の最初の日です。 その週の2日だけが2018年になり、残りは2019年になります。ロケールのルールを使用して、その週(7日すべて)を2018週53または2019週1のどちらに分類するかを決定します。あなたの場合、彼らは2019週1と言いました。