Moment: 特定のダウ/ドイコンボの `weekOfYear`が正しくない

作成日 2014年12月21日  ·  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月のx番目です。 No.1。

したがって、1月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週が1月1日の週であることを意味します。 私が正しく理解していれば、 {dow:6, doy: 1}は、第1週の離れた場所に12月26日が含まれていることを意味します。

{ dow: 6, doy: 12 }を使用したテストをプルリクエストに追加しました。

{ dow: 6, doy: 1 }ですか? doy値が7より大きい場合、実際の意味はないと思います。それはタイプミスでしたか?

いいえ、 {dow: 6, doy: 12}を意味します。 doyは、1月の第1週の日ではないことに注意してください。 {dow: 6, doy: 12}はアラビア語の国の標準です。週は土曜日に始まり、第1週は1月1日を含む週です。

バグは実際には日付からの週の計算ではなく、反対方向にありました。

そうだとすれば、この間ずっとdoy誤解してきました。

実際、ドキュメントによるとlocaleData.firstDayOfYear()は0から15までの任意の整数を返すことができますが、それは私にはとても奇妙に思えます。

私が理解するのを助けるために、なぜそれが1ではなく12であるのか説明できますか? そして、この場合、 1または4 doyは何を意味しますか? 正確には、数学はここでどのように機能しますか? あなたはこれをよく理解しているようです。

私は良い説明を見つけました。それはdoyが何であるかをより明確にしますが、それが6より大きくなる可能性があることをまだ理解できないようです。

@icambron 、チャイムを入れてくれませんか? これを現在のドキュメントよりも完全に説明している場所へのリンクはありますか?

@usmonsterこれを見て久しぶりですが、頭から離れて…ええ、私もdoy値が6を超えるとうまくいかないようです。 。

方法の理由、 doy定義方法を説明することはできませんが、 7 + dow - janXに設定できます。ここで、 janXは、その週に属する必要がある1月のx番目です。 No.1。

したがって、1月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を廃止し、週の構成に新しいオプション( minDaysdomなど)を導入して、「1月の日」の最小数を指定することです(1- 7)それはその年の最初の週にあるべきです。 これは、誤って指定された場合、 doyを上書きします。

何かご意見は?

私が知る限り、コードをiso週間に設定していたので、事実を悪用して、数値が機能することを確認しました。

セマンティクスをユーザーにとってより意味のあるものに変更すると、より良い結果になる可能性があります。 ただし、下位互換性がある必要があります(したがって、新しいメソッドは新しい数値を公開します)。

あなたの例のように、それはダウに関連しているので、doyに7を数回追加すればそれを機能させることができます。

#2336を支持してこれを閉じる

こんにちは@ichernev。 :) 1年後に戻ってきましたが、構文を変更せずに下位互換性のあることを行うことはほぼ確実ではありませんが、より意味のあるセマンティクスを実装することに賛成です。

ダウに関連しているため、doyに7を数回追加すると機能するようになります。

これが常に当てはまるとは思いません。たとえば、 { dow: 0, doy: 6 }は、提案されたセマンティック変更の前後で同じことを意味するわけではありません。 (これが、別の名前を優先してdoyを非推奨にすることを提案した理由です。)

これに関するフィードバックはどこで検索すればよいですか? この特定の問題はクローズされていますが、会話をmoment / momentjs.com#279に移動するか、より適切な場合は新しい問題を開くことができます。

doyどのように機能するかを理解するために余分な日を費やし、それを行うために瞬間のソースをダウンロードしなければならなかったので、これもぶつけたいと思います。 @usmonsterが示唆するように、新しい、より意味的に関連性のある設定変数を導入することは素晴らしいことです。

このページは役に立ちましたか?
0 / 5 - 0 評価