Moment: salah `weekOfYear` untuk kombo dow / doy tertentu

Dibuat pada 21 Des 2014  ·  13Komentar  ·  Sumber: moment/moment

Tampaknya algoritme kalkulasi minggu tidak cukup umum, karena tampaknya menangani kombinasi dow / doy tertentu secara tidak benar:

// 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

Saya berasumsi ada sesuatu yang salah dalam fungsi weekOfYear , kecuali saya melakukan sesuatu yang salah?

Bug

Komentar yang paling membantu

Saya tidak dapat menjelaskan alasannya, bagaimana doy didefinisikan, tetapi Anda dapat mengaturnya menjadi 7 + dow - janX mana janX adalah x-th Januari yang harus dimiliki minggu itu Nomor 1.

Jadi, jika tanggal 1 Januari harus termasuk dalam minggu No. 1 dan Sabtu adalah hari pertama dalam minggu tersebut, maka doy = 7 + 6 - 1 = 12 . Untuk ISO itu akan menjadi doy = 7 + 1 - 4 = 4 untuk AS itu akan menjadi doy = 7 + 0 - 1 = 6 .

Semua 13 komentar

Ada pemikiran? Ini memengaruhi banyak tempat di mana hari pertama dalam seminggu bukan Minggu atau Senin. Jika bug diverifikasi, haruskah saya mengajukan permintaan penarikan untuk perhitungan weekOfYear , atau apakah sudah ada rencana untuk memperbaiki algoritma saat ini?

Harus saya akui, bahwa setting doy cukup membingungkan saya. { dow: 6, doy: 12 } berarti bahwa minggu dimulai pada hari Sabtu dan minggu ke-1 adalah minggu dengan tanggal 1 Januari. Jika saya memahaminya dengan benar {dow:6, doy: 1} berarti minggu pertama aways berisi 26 Desember.

Saya telah menambahkan tes dengan { dow: 6, doy: 12 } ke permintaan tarik.

Apakah maksud Anda { dow: 6, doy: 1 } ? Saya pikir nilai doy lebih besar dari 7 tidak memiliki arti yang sebenarnya .. Apakah itu salah ketik?

Tidak, maksud saya {dow: 6, doy: 12} . Perhatikan bahwa doy adalah _bukan_ hari di bulan Januari yang merupakan minggu pertama. {dow: 6, doy: 12} adalah standar di negara-negara Arab - minggu dimulai pada hari Sabtu dan minggu pertama adalah minggu yang berisi tanggal 1 Januari.

Bug itu sebenarnya tidak ada dalam perhitungan minggu dari tanggal tersebut, hanya ke arah lain.

Wah, jika itu masalahnya, maka selama ini telah salah paham doy ..

Memang, menurut dokumen localeData.firstDayOfYear() dapat mengembalikan bilangan bulat apa pun antara 0 dan 15 inklusif, tetapi itu tampak sangat aneh bagi saya.

Hanya untuk membantu saya memahami, dapatkah Anda menjelaskan mengapa angka 12 dan bukan 1? Dan apa artinya doy dari 1 atau 4 dalam kasus ini? Bagaimana tepatnya, cara kerja matematika di sini? Sepertinya Anda memiliki pemahaman yang baik tentang ini ..

Saya menemukan penjelasan yang bagus, yang membuatnya lebih jelas apa itu doy , meskipun saya masih belum bisa membayangkan bagaimana bisa lebih dari 6 ..

@icambron , bisakah Anda

@usmonster Sudah lama sekali sejak aku melihat ini, tapi di luar kepalaku ... ya, aku juga tidak mengerti. Maaf saya tidak bisa lebih membantu. Setiap kali saya menulis penjelasan terkait, saya baru saja menulis banyak implementasi Momen untuk menangani minggu, jadi saya mungkin memahaminya saat itu, tetapi penjelasan itu tampaknya tidak cocok dengan doy values> 6, jadi .. .

Saya tidak dapat menjelaskan alasannya, bagaimana doy didefinisikan, tetapi Anda dapat mengaturnya menjadi 7 + dow - janX mana janX adalah x-th Januari yang harus dimiliki minggu itu Nomor 1.

Jadi, jika tanggal 1 Januari harus termasuk dalam minggu No. 1 dan Sabtu adalah hari pertama dalam minggu tersebut, maka doy = 7 + 6 - 1 = 12 . Untuk ISO itu akan menjadi doy = 7 + 1 - 4 = 4 untuk AS itu akan menjadi doy = 7 + 0 - 1 = 6 .

Ah, jika _implemented_ seperti ini, saya pikir itu masalah dengan implementasinya. Tidak ada definisi lain yang pernah saya lihat (yaitu ISO, Unicode TR35) yang mendefinisikan kalkulasi mingguan seperti ini. Komentar di API bahkan tidak mengisyaratkan bahwa inilah yang terjadi, meskipun sekarang saya perhatikan bahwa tes telah ditulis yang mengasumsikan logika ini, misalnya, saya melihat baris seperti ini:

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.

Dan di file lain:

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.

Jadi penilaian Anda atas penerapannya terlihat akurat. Tetap saja, rasanya menjijikkan, seolah tes ditulis untuk menyesuaikan dengan implementasi yang rusak.

Hal ini sangat membuat frustasi karena hal yang lebih bersih untuk dilakukan adalah hanya memperbaiki penerapan sehingga ia melakukan apa yang intuitif (ambil " janX " yang harus ada di minggu pertama), tetapi memperbaikinya sekarang tidak akan ' t kompatibel ke belakang. Ugh.

Alternatifnya adalah dengan menghentikan doy dan memperkenalkan opsi baru ke konfigurasi minggu, misalnya minDays atau dom , untuk menentukan jumlah minimum "hari Januari" (1- 7) yang harus di minggu pertama tahun ini. Ini akan menimpa doy jika tidak sengaja ditentukan.

Ada pemikiran?

Sejauh yang saya tahu kami telah menyiapkan kode untuk minggu-minggu iso, lalu kami menyalahgunakan fakta tersebut dan memastikan angka-angka membuatnya berfungsi.

Jika kita mengubah semantik menjadi sesuatu yang lebih bermakna bagi pengguna, mungkin akan lebih baik. Tapi itu harus kompatibel ke belakang (jadi metode baru mengekspos nomor baru).

Sebagai contoh, Anda dapat membuatnya berfungsi jika Anda menambahkan 7 beberapa kali ke doy, karena relatif terhadap dow.

Menutup ini demi # 2336

Halo @ichernev. :) Kembali ke hal ini setahun kemudian, saya masih mendukung penerapan semantik yang lebih bermakna, meskipun saya hampir yakin tidak mungkin melakukan sesuatu yang kompatibel ke belakang tanpa juga mengubah sintaks.

Anda dapat membuatnya bekerja jika Anda menambahkan 7 beberapa kali ke doy, karena relatif terhadap dow.

Saya tidak yakin ini selalu terjadi .. Misalnya, { dow: 0, doy: 6 } tidak akan berarti hal yang sama sebelum dan sesudah perubahan semantik yang diusulkan. (Inilah mengapa saya mengusulkan penghentian doy demi nama lain.)

Di mana saya harus mencari lebih banyak umpan balik tentang ini? Masalah khusus ini telah ditutup, meskipun saya dapat memindahkan percakapan ke moment / momentjs.com # 279 atau membuka masalah baru jika lebih sesuai.

Saya juga ingin mendapatkan ini, karena saya menghabiskan satu hari ekstra untuk mencoba mencari tahu bagaimana doy bekerja dan harus mengunduh sumber momen untuk melakukannya. Akan sangat bagus untuk memperkenalkan variabel pengaturan baru yang lebih relevan secara semantik, seperti yang disarankan @usmonster .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat