Moment: Apakah ini cara untuk .add() atau .subtract() nilai float?

Dibuat pada 20 Jun 2015  ·  3Komentar  ·  Sumber: moment/moment

moment().add(1, "months") // >> Mon Jul 20 2015 13:36:12 GMT+0200
moment().add(1.9, "months") // >> Mon Jul 20 2015 13:36:12 GMT+0200
// Excpected: Mon Aug 17 2015 09:34:37 GMT+0200

Untuk saat ini, saya harus melakukan:

var duration = moment.duration(1.9, "months"); 
var ms = duration.asMilliseconds();
var date = moment().add(ms, "ms");

Mengapa metode ini tidak dapat menambah atau mengurangi nilai float?

Komentar yang paling membantu

Ini berdasarkan desain, tetapi mungkin bisa dijelaskan lebih baik dalam dokumentasi.

Anda dapat menggunakan desimal saat menambahkan atau mengurangi jam, menit, detik, atau milidetik, tetapi Anda tidak dapat membagi hari atau komponen yang lebih besar.

Alasannya adalah bahwa ada perbedaan logis antara matematika waktu dan matematika tanggal.

Matematika waktu mengasumsikan skala waktu linier, hanya menambah atau mengurangi cap waktu berbasis UTC. Ini menangani transisi DST secara real-time. Misalnya, untuk sebagian besar tempat di Amerika Serikat, 2015-03-08T01:00:00 ditambah satu jam akan menjadi 2015-03-08T03:00:00 karena jam dari 2:00 hingga 3:00 dilewati untuk transisi DST.

Matematika tanggal tidak menggunakan skala waktu linier, melainkan menggunakan tanggal pada kalender. Menggunakan contoh yang sama, 2015-03-08T01:00:00 ditambah satu _day_ akan menjadi 2015-03-09T01:00:00 , meskipun hanya 23 jam telah berlalu. Oleh karena itu, "hari" adalah konteks ini bukan jumlah waktu yang tetap, dan dengan demikian membaginya menjadi tidak masuk akal. (Apakah setengah hari akan menjadi 12 jam kemudian, atau 11,5 jam kemudian pada hari ini?)

Bahkan tanpa DST, pertimbangkan bahwa tidak semua bulan adalah 30 hari, dan tidak semua tahun adalah 365 hari. "Menambahkan" satu tahun, tidak benar-benar berarti "menambah 365 hari", itu berarti, "majukan posisi di kalender ke bulan dan hari yang sama di tahun berikutnya". Ini menciptakan ambiguitas tertentu, seperti ketika menambahkan satu tahun ke 29 Februari di tahun kabisat dan berakhir di tahun non-kabisat. Kami memilih untuk mendarat pada 28 Februari, tetapi mendarat pada 1 Maret akan sama-sama valid.

Sebagai contoh lain, perhatikan bahwa 31 Agustus ditambah satu bulan, dikurangi satu bulan, adalah tanggal 30 Agustus.

Sejak matematika tanggal tidak mengikuti aturan normal penjumlahan dan pengurangan matematika, matematika juga tidak dapat menangani operasi pembagian atau perkalian, dan dengan demikian Anda tidak dapat menambahkan 1,9 bulan.

Untuk memikirkannya dengan cara lain, apa yang Anda harapkan dari hasil tengah malam tanggal 15 Juni + 1,5 bulan? Salah satu hal berikut dapat dilakukan oleh manusia:

  • 2015-06-15T00:00 + (0,5 * 30 hari di bulan Juni) = 2015-06-30T00:00 + (1 bulan = 30 hari) = 2015-07-30T00:00
  • 2015-06-15T00:00 + (0,5 * 30 hari di bulan Juni) = 2015-06-30T00:00 + (1 bulan = 31 hari) = 2015-07-31T00:00
  • 2015-06-15T00:00 + 1 bulan = 2015-07-15T00:00 + (0,5 * 31 hari di bulan Juli) = 2015-07-30T12:00
  • 2015-06-15T00:00 + [(61 hari di bulan Juni dan Juli / 2 = 30,5 hari rata-rata di bulan ini) * 1,5 bulan = 45,75 hari] = 2015-07-30T18:00

Jadi, inilah empat jawaban berbeda yang semuanya merupakan hasil logis - itulah sebabnya Anda tidak dapat membagi satuan saat mengerjakan matematika tanggal.

Semua 3 komentar

Ini berdasarkan desain, tetapi mungkin bisa dijelaskan lebih baik dalam dokumentasi.

Anda dapat menggunakan desimal saat menambahkan atau mengurangi jam, menit, detik, atau milidetik, tetapi Anda tidak dapat membagi hari atau komponen yang lebih besar.

Alasannya adalah bahwa ada perbedaan logis antara matematika waktu dan matematika tanggal.

Matematika waktu mengasumsikan skala waktu linier, hanya menambah atau mengurangi cap waktu berbasis UTC. Ini menangani transisi DST secara real-time. Misalnya, untuk sebagian besar tempat di Amerika Serikat, 2015-03-08T01:00:00 ditambah satu jam akan menjadi 2015-03-08T03:00:00 karena jam dari 2:00 hingga 3:00 dilewati untuk transisi DST.

Matematika tanggal tidak menggunakan skala waktu linier, melainkan menggunakan tanggal pada kalender. Menggunakan contoh yang sama, 2015-03-08T01:00:00 ditambah satu _day_ akan menjadi 2015-03-09T01:00:00 , meskipun hanya 23 jam telah berlalu. Oleh karena itu, "hari" adalah konteks ini bukan jumlah waktu yang tetap, dan dengan demikian membaginya menjadi tidak masuk akal. (Apakah setengah hari akan menjadi 12 jam kemudian, atau 11,5 jam kemudian pada hari ini?)

Bahkan tanpa DST, pertimbangkan bahwa tidak semua bulan adalah 30 hari, dan tidak semua tahun adalah 365 hari. "Menambahkan" satu tahun, tidak benar-benar berarti "menambah 365 hari", itu berarti, "majukan posisi di kalender ke bulan dan hari yang sama di tahun berikutnya". Ini menciptakan ambiguitas tertentu, seperti ketika menambahkan satu tahun ke 29 Februari di tahun kabisat dan berakhir di tahun non-kabisat. Kami memilih untuk mendarat pada 28 Februari, tetapi mendarat pada 1 Maret akan sama-sama valid.

Sebagai contoh lain, perhatikan bahwa 31 Agustus ditambah satu bulan, dikurangi satu bulan, adalah tanggal 30 Agustus.

Sejak matematika tanggal tidak mengikuti aturan normal penjumlahan dan pengurangan matematika, matematika juga tidak dapat menangani operasi pembagian atau perkalian, dan dengan demikian Anda tidak dapat menambahkan 1,9 bulan.

Untuk memikirkannya dengan cara lain, apa yang Anda harapkan dari hasil tengah malam tanggal 15 Juni + 1,5 bulan? Salah satu hal berikut dapat dilakukan oleh manusia:

  • 2015-06-15T00:00 + (0,5 * 30 hari di bulan Juni) = 2015-06-30T00:00 + (1 bulan = 30 hari) = 2015-07-30T00:00
  • 2015-06-15T00:00 + (0,5 * 30 hari di bulan Juni) = 2015-06-30T00:00 + (1 bulan = 31 hari) = 2015-07-31T00:00
  • 2015-06-15T00:00 + 1 bulan = 2015-07-15T00:00 + (0,5 * 31 hari di bulan Juli) = 2015-07-30T12:00
  • 2015-06-15T00:00 + [(61 hari di bulan Juni dan Juli / 2 = 30,5 hari rata-rata di bulan ini) * 1,5 bulan = 45,75 hari] = 2015-07-30T18:00

Jadi, inilah empat jawaban berbeda yang semuanya merupakan hasil logis - itulah sebabnya Anda tidak dapat membagi satuan saat mengerjakan matematika tanggal.

Terima kasih banyak telah meluangkan waktu untuk menulis jawaban yang sangat rinci ini. Saya lebih memahami logika di balik pengoperasian fungsi-fungsi ini.

Saya tidak bisa menahan diri untuk berterima kasih kepada Matt, saya telah melewati masalah yang sama yang dialami Delgan, dan sobat! jawaban anda sangat lengkap, terima kasih.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat