Saya mencari cara termudah, terbersih untuk menambahkan X bulan ke tanggal JavaScript.
Saya lebih suka tidak menangani bergulir tahun ini atau harus menulis fungsi saya sendiri .
Apakah ada sesuatu yang dibangun di dalam yang dapat melakukan ini?
javascript
date
Chad
sumber
sumber
Jawaban:
Fungsi berikut menambahkan bulan ke tanggal dalam JavaScript ( sumber ). Ini memperhitungkan roll-overs tahun akun dan panjang bulan yang bervariasi:
Solusi di atas mencakup kasus tepi bergerak dari bulan dengan jumlah hari lebih besar dari bulan tujuan. misalnya.
Jika hari dalam sebulan berubah saat melamar
setMonth
, maka kami tahu kami telah melimpah ke bulan berikutnya karena perbedaan panjang bulan. Dalam hal ini, kami gunakansetDate(0)
untuk kembali ke hari terakhir bulan sebelumnya.Catatan: versi jawaban ini menggantikan versi sebelumnya (di bawah) yang tidak dengan anggun menangani panjang bulan yang berbeda.
sumber
addMonths
fungsi di sini yang menghormati akhir bulan (misalnya2012-01-31 + 1 month = 2012-02-29
dan seterusnya).Saya menggunakan perpustakaan moment.js untuk manipulasi tanggal-waktu . Kode sampel untuk ditambahkan satu bulan:
sumber
Fungsi ini menangani kasing tepi dan cepat:
uji:
Pembaruan untuk tanggal non-UTC: (oleh A.Hatchkins)
uji:
sumber
Mempertimbangkan tidak satu pun dari jawaban ini yang akan menjelaskan tahun berjalan ketika bulan tersebut berubah, Anda dapat menemukan jawaban yang saya buat di bawah ini yang seharusnya menanganinya:
Metode:
Pemakaian:
sumber
Diambil dari respons @bmpsini dan @Jazaret , tetapi tidak memperluas prototipe: menggunakan fungsi polos ( Mengapa memperluas objek asli adalah praktik yang buruk? ):
Gunakan:
sumber
Dari jawaban di atas, satu-satunya yang menangani kasus tepi (bmpasini dari perpustakaan datejs) memiliki masalah:
ok tapi
lebih buruk :
Hal ini disebabkan oleh waktu yang tidak ditetapkan, sehingga kembali ke 00:00:00, yang kemudian dapat rusak ke hari sebelumnya karena perubahan zona waktu atau penghematan waktu atau apa pun ...
Inilah solusi yang saya usulkan, yang tidak memiliki masalah itu, dan saya pikir, lebih elegan karena tidak bergantung pada nilai-nilai hard-coded.
Unit berhasil diuji dengan:
sumber
Karena sebagian besar jawaban disorot, kita bisa menggunakan metode setMonth () bersama dengan getMonth () metode untuk menambahkan jumlah bulan tertentu ke tanggal yang diberikan.
Contoh: (seperti yang disebutkan oleh @ChadD dalam jawabannya.)
Tapi kita harus hati-hati menggunakan solusi ini karena kita akan mendapat masalah dengan kasus tepi.
Untuk menangani kasus tepi, jawaban yang diberikan di tautan berikut bermanfaat.
https://stackoverflow.com/a/13633692/3668866
sumber
Solusi sederhana:
2678400000
adalah 31 hari dalam milidetikMemperbarui:
Gunakan data ini untuk membangun fungsi kita sendiri:
2678400000
- 31 hari2592000000
- 30 hari2505600000
- 29 hari2419200000
- 28 harisumber
Bulan memiliki indeks berbasis 0, harus waspada (4) yaitu 5 (mungkin);
sumber
Hanya dengan menambahkan jawaban dan komentar yang diterima.
sumber
Saya menulis solusi alternatif ini yang berfungsi baik bagi saya. Ini berguna ketika Anda ingin menghitung akhir kontrak. Misalnya, mulai = 2016-01-15, bulan = 6, akhir = 2016-7-14 (yaitu hari terakhir - 1):
Contoh:
sumber
Berikut ini adalah contoh cara menghitung tanggal di masa mendatang berdasarkan input tanggal (membershipssignup_date) + bulan ditambahkan (membershipsmonths) melalui bidang formulir.
Bidang keanggotaanhipsmonths memiliki nilai default 0
Trigger link (dapat berupa acara pertukaran yang terlampir pada bidang istilah keanggotaan):
sumber
Seperti yang ditunjukkan oleh banyak jawaban rumit dan jelek yang disajikan, Tanggal dan Waktu dapat menjadi mimpi buruk bagi programmer yang menggunakan bahasa apa pun. Pendekatan saya adalah mengonversi tanggal dan nilai 'delta t' menjadi Epoch Time (dalam ms), melakukan aritmatika apa pun, lalu mengonversi kembali ke "waktu manusia".
Ini ditulis untuk use case yang sedikit berbeda, tetapi Anda harus dapat dengan mudah mengadaptasinya untuk tugas-tugas terkait.
EDIT: Sumber lengkap di sini !
sumber
Semua ini tampaknya terlalu rumit dan saya kira itu menjadi perdebatan tentang apa sebenarnya yang menambahkan "satu bulan" artinya. Apakah ini berarti 30 hari? Apakah ini berarti dari tanggal 1 hingga tanggal 1? Dari hari terakhir hingga hari terakhir?
Jika yang terakhir, kemudian menambahkan satu bulan ke 27 Februari membuat Anda ke 27 Maret, tetapi menambahkan satu bulan ke 28 Februari membuat Anda ke 31 Maret (kecuali dalam tahun kabisat, di mana itu membuat Anda ke 28 Maret). Kemudian kurangi satu bulan dari 30 Maret membuat Anda ... 27 Februari? Siapa tahu...
Bagi mereka yang mencari solusi sederhana, cukup tambahkan milidetik dan lakukan.
atau
sumber
d.setMonth(d.getMonth()+1)
? Jadi ini bahkan bukan ide yang paling sederhana.sumber
Terkadang berguna membuat tanggal oleh satu operator seperti pada parameter BIRT
Saya mendapat 1 bulan kembali dengan:
sumber
Seperti metode yang dinyatakan di atas, Anda dapat menambahkan bulan
Date
berfungsi.sumber