Moment: Kontrol atas perilaku eksklusivitas/eksklusivitas IsAntara

Dibuat pada 16 Jan 2015  ·  28Komentar  ·  Sumber: moment/moment

Metode isBetween memeriksa apakah suatu momen berada di antara dua momen lainnya, tetapi tidak apakah itu sama dengan salah satu waktu perbandingan. Saya pikir kita memerlukan argumen inklusif, meskipun dengan argumen ketiga saat ini menjadi unit, mungkin yang terbaik adalah membuat metode isBetweenInclusive yang terpisah.

Terima kasih

Enhancement Up-For-Grabs

Komentar yang paling membantu

Ini adalah fitur hebat dan sangat dibutuhkan!!!!

Semua 28 komentar

Saya juga ingin ini.

Saya setuju, ini akan menjadi fitur berguna yang luar biasa. Mampu memilih antara isBetween inklusif dan eksklusif, atau meneruskan inklusi sebagai argumen boolean akan menjadi hal yang fantastis.

Sebenarnya ada sedikit lebih banyak pemikiran yang perlu masuk ke fungsi ini daripada apa yang saat ini ditawarkan atau apa yang sedang diusulkan.

Dalam skenario dunia nyata, nilai awal selalu inklusif, tetapi nilai akhir bersifat inklusif atau eksklusif _bergantung pada granularitas_. Khususnya, jika nilainya mencakup komponen waktu, nilai akhir harus eksklusif. Jika tidak termasuk komponen waktu, maka harus _inclusive_.

Pikirkan seperti ini. Jika saya bertanya berapa hari antara 1 Januari dan 3 Januari - jawabannya adalah tiga hari . Tetapi jika saya bertanya kepada Anda berapa jam antara 1:00 dan 3:00, jawabannya adalah dua jam . Manusia secara alami melakukan ini. Ini berdampak pada bagaimana kita mengukur durasi antar interval (seperti dengan moment#diff ), dan bagaimana kita menguji sebuah nilai untuk melihat apakah nilainya berada dalam jangkauan (seperti dengan moment#inBetween ).

Perilaku moment#isBetween ini sepenuhnya eksklusif, terlepas dari perinciannya. Ini tidak terlalu berguna.

Perilaku moment#diff ini inklusif di awal, dan eksklusif di akhir, sekali lagi, terlepas dari perinciannya. Ini berlaku untuk waktu, bug tidak valid selama berhari-hari. Memang, contoh dalam dokumen adalah:

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') // 1

Padahal kenyataannya, kebanyakan orang akan mengharapkan hasilnya menjadi 2 hari.

Masalah utamanya adalah bahwa objek moment adalah unit waktu yang tersembunyi, tetapi dalam banyak kasus kami mencoba memperlakukannya seperti tanggal di kalender, dan di sinilah efek sampingnya mulai terlihat.

Pikirkan seperti ini. Jika saya bertanya berapa hari antara 1 Januari dan 3 Januari - jawabannya adalah tiga hari. Tetapi jika saya bertanya kepada Anda berapa jam antara 1:00 dan 3:00, jawabannya adalah dua jam.

Saya pikir jawaban logis (dan bagi saya, diharapkan) adalah "2" ketika menanyakan perpustakaan tanggal jumlah hari antara "1 Januari" dan "3 Januari". Alasannya adalah bahwa tanpa waktu yang ditentukan, saya berharap itu akan berhasil antara "1 Januari 00:00" dan "3 Januari pukul 00:00". Bagaimana manusia mengatasi perbedaan di dunia nyata benar-benar tergantung pada konteksnya, tetapi saya tidak berpikir itu ada hubungannya dengan cara kerja di dunia pemrograman.

Inilah cara melakukannya untuk Karbon PHP dan saya tidak pernah menemukan ini menjadi masalah: https://github.com/briannesbitt/Carbon/blob/master/src/Carbon/Carbon.php#L1070 -1092

Yang kedua kami bergabung adalahAntara saya tahu beberapa orang ingin menentukan perilaku yang berbeda untuk interval, tetapi saya belum melihat proposal yang bagus. Pada akhirnya kedua ujungnya akan dapat dikonfigurasi secara terpisah (apakah inklusif/eksklusif).

Ini juga harus kompatibel dengan versi saat ini.

// proposal 1
m.isBetween(a, b, "()"); // both excluded
m.isBetween(a, b, "[)"); // start included, end excluded

// proposal 2
m.isBetween(a, b, "+"); // both included
m.isBetween(a, b, "+-"); // start included, end excluded

Saya tidak bisa memikirkan skenario dunia nyata untuk mengecualikan awal, jadi itu bisa menjadi tanda boolean untuk mengecualikan akhir atau tidak.

Meskipun - Saya suka proposal 1, karena mendekati notasi interval ISO 31-11 yang tepat

// these are essential
m.isBetween(a, b, "[]"); // both included
m.isBetween(a, b, "[)"); // start included, end excluded

// these would be rarely used, but complete the syntax
m.isBetween(a, b, "()"); // both excluded
m.isBetween(a, b, "(]"); // start excluded, end included

Saya tidak terlalu suka proposal 2. (jangan tersinggung)

:+1: untuk proposal satu.

Sejujurnya saya tidak dapat melihat skenario apa pun di mana Anda secara eksplisit ingin mengecualikan salah satu ujungnya tetapi tidak keduanya. Bahkan jika Anda mencoba untuk melihat "sampai hari ini", Anda dapat menggunakan moment( date ).endOf( "day" ) sebagai tanggal akhir, yang akan memberi Anda 23:59.59.

Saya pikir seharusnya ada flag boolean untuk membuatnya inklusif/eksklusif, seperti rentang "normal" di sebagian besar bahasa pemrograman. Tetap sederhana untuk mencegah kebingungan - jika Anda ingin waktu _tepat sebelum_ waktu berakhir, ada cara lain untuk mendapatkannya.

@mckinnsb - Pendekatan itu biasanya dihindari karena dua alasan:

  1. Ketepatan menjadi penting. Dalam JavaScript, kemungkinan waktu terakhir dari hari standar adalah 23:59:59.999 , tetapi dalam bahasa lain bisa 23:59:59 , atau 23:59:59.9999999 . Kami berinteraksi dengan nilai dari sumber lain melalui penguraian dan pemformatan string, jadi ini penting.
  2. Jika Anda menentukan rentang dari 00:00:00.000 hingga 23:59:59.999 - Anda tidak dapat dengan mudah menentukan durasi rentang. Alih-alih hanya duration = end - start , Anda sekarang harus melakukan sesuatu seperti duration = end - start + epsilon , di mana epsilon adalah presisi minimal, seperti yang dibahas di atas.

Saya juga akan menolak pernyataan Anda bahwa ada rentang "normal" di sebagian besar bahasa pemrograman. Pada kenyataannya, banyak rentang pemrograman tidak memiliki tipe rentang bawaan. Ketika mereka melakukannya, perilaku mereka adalah bahasa tertentu. Tidak ada yang "biasa".

Lihat juga posting quora ini tentang fungsi range dengan Python.

+1 untuk proposal 1, membuat semuanya fleksibel.
Harapan pertama saya adalah sama bahwa batas atas dan bawah akan dimasukkan, seperti yang akan saya lakukan di SQL, X Antara A DAN B,
Saat ini sedang mengerjakannya dengan x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

+1

+1

+1 proposal 1

+1

+1

+1

@mj1856 Bukankah perilaku default '()' ?

Is Between 2.9.0+
"Check if a moment is between two other moments, optionally looking at unit scale (minutes, hours, days, etc). **The match is exclusive.**"

isBetween sudah memiliki parameter opsional ke-3. Saat ini metode didefinisikan sebagai function isBetween (from, to, units) mana units adalah opsional. Proposal ini menghasilkan parameter opsional ke-4, sehingga implementasi harus menangani dua kemungkinan opsi ketiga (eksklusif/inklusif vs unit) atau keempatnya.

Beberapa solusi (tidak diuji):

() = x.isBetween(start, end) //sepenuhnya eksklusif - implementasi default saat ini
(] = x.isAfter(mulai) && x.isSameOrBefore(end) //eksklusif kiri, inklusif kanan
[) = x.isSameOrAfter(mulai) && x.isBefore(end) //inklusif kiri, eksklusif kanan
[] = !(x.isBefore(a) || x.isAfter(b)) //inklusif penuh

Mungkin solusi yang lebih mudah dibaca seperti ini:

() = x.isAntara(a,b)
(] = x.isAntara(a,b) || x.isSame(b)
[) = x.sama(a) || x.isAntara(a,b)
[] = x.isAntara(a, b) || x.sama(a) || x.isSame(b) // sama dengan !(x.isBefore(a) || x.isAfter(b))

Karena parameter ke-3 dan ke-4 bersifat opsional, mungkin baik untuk memasukkan objek

var options = {
   units: 'milliseconds', // 'year', 'month', etc.
   inclusive: '{)' // '{}', '()', '(}', '{)'
}
m.isBetween(start, end, options)

Di mana unit default adalah milidetik dan inklusif default adalah () .

Sial.. kalian benar. Maaf. Menulis ulang...

Menandai ini untuk diperebutkan. Penggunaan yang diharapkan akan seperti proposal 1 di atas, yang akan memungkinkan parameter opsional _fourth_ diteruskan ke isBetween , yang berisi salah satu dari '[]' , '[)' , '()' , '(]' . Ini harus mencakup tes untuk keempatnya. Default ketika tidak diteruskan harus sama dengan '()' , yang juga merupakan perilaku saat ini.

WRT opsi - Saya benar-benar tidak punya preferensi. Seseorang bisa saja melewatkan null di parameter ketiga untuk mendapatkan yang keempat, atau mengizinkan salah satu item untuk dilewatkan sebagai parameter ketiga atau parameter keempat, karena kita terbatas pada nilai yang diketahui. Objek opsi juga baik-baik saja. Apa pun yang menurut pelaksana paling mudah - atau sih, Anda bisa melakukan semua hal di atas.

Kecuali, tentu saja, orang lain memiliki pendapat yang kuat tentang itu. :)

Awal yang baik di PR #2943. Kami akan melacak ini di PR itu. Terima kasih!

+1

Saya akan BENAR-BENAR suka menggunakan fungsionalitas dalam komit @darrenjennings hari ini.

Apakah Anda berbicara tentang ini tersedia di v2.13? @rbreier
https://momentjs.com/docs/#/query/is -between/

Itulah yang saya cari. Terima kasih banyak. Saya memperbarui dan ini berfungsi dengan baik untuk saya.

Ini adalah fitur hebat dan sangat dibutuhkan!!!!

Yang kedua kami bergabung adalahAntara saya tahu beberapa orang ingin menentukan perilaku yang berbeda untuk interval, tetapi saya belum melihat proposal yang bagus. Pada akhirnya kedua ujungnya akan dapat dikonfigurasi secara terpisah (apakah inklusif/eksklusif).

Ini juga harus kompatibel dengan versi saat ini.

// proposal 1
m.isBetween(a, b, "()"); // both excluded
m.isBetween(a, b, "[)"); // start included, end excluded

// proposal 2
m.isBetween(a, b, "+"); // both included
m.isBetween(a, b, "+-"); // start included, end excluded

console.log('isBetweenFlag', moment('2010-10-19').isBetween('2010-10-19', '2010-10-25',"+"));

ketika saya menggunakan kondisi di atas, itu membuat saya kesalahan pertama dan kemudian kondisi akan gagal. saya menggunakan sudut 6

Apakah halaman ini membantu?
0 / 5 - 0 peringkat