Jika Anda memberikan 0
sebagai di dayValue
dalam Date.setFullYear
Anda mendapatkan hari terakhir bulan sebelumnya:
d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008
Ada referensi untuk perilaku ini di mozilla . Apakah ini fitur lintas-browser yang dapat diandalkan atau haruskah saya melihat metode alternatif?
javascript
date
Ken
sumber
sumber
Jawaban:
Perbedaan output disebabkan oleh perbedaan dalam
toString()
implementasi, bukan karena tanggalnya berbeda.Tentu saja, hanya karena peramban yang diidentifikasi di atas menggunakan 0 sebagai hari terakhir bulan sebelumnya tidak berarti mereka akan terus melakukannya, atau peramban yang tidak terdaftar akan melakukannya, tetapi memberikan kredibilitas pada keyakinan bahwa peramban harus bekerja dengan baik. cara yang sama di setiap browser.
sumber
new Date
adalah begitu jauh lebih lambat dibandingkan metode perhitungan lain yang bahkan tidak muncul di chart Perf : jsperf.com/days-in-month-perf-test/6Saya akan menggunakan tanggal antara dengan hari pertama bulan berikutnya, dan mengembalikan tanggal dari hari sebelumnya:
sumber
today = new Date(); new Date(today.getFullYear(), today.getMonth()+1, 0).toString();
Saya menemukan ini menjadi solusi terbaik untuk saya. Biarkan objek Date menghitungnya untuk Anda.
Mengatur parameter hari ke 0 berarti satu hari kurang dari hari pertama bulan yang merupakan hari terakhir dari bulan sebelumnya.
sumber
new Date
ini begitu jauh lebih lambat itu bahkan tidak muncul di chart Perf : jsperf.com/days-in-month-perf-test/6Dalam istilah komputer,
new Date()
danregular expression
solusinya lambat! Jika Anda menginginkan one-liner super cepat (dan super-samar), coba yang satu ini (anggapm
dalamJan=1
format). Saya terus mencoba berbagai perubahan kode untuk mendapatkan kinerja terbaik.Versi tercepat saya saat ini :
Setelah melihat pertanyaan terkait ini , periksa tahun kabisat menggunakan operator bitwise (kecepatan luar biasa) dan menemukan apa yang diwakili bilangan ajaib 25 & 15, saya telah menghasilkan hibrida jawaban yang dioptimalkan ini:
Mengingat bit-shifting ini jelas mengasumsikan bahwa
m
&y
parameter Anda sama-sama bilangan bulat, karena angka yang lewat sebagai string akan menghasilkan hasil yang aneh.JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
Hasil JSPerf: http://jsperf.com/days-in-month-head-to-head/5
Untuk beberapa alasan,
(m+(m>>3)&1)
lebih efisien daripada(5546>>m&1)
di hampir semua browser.Satu-satunya kompetisi nyata untuk kecepatan adalah dari @GitaarLab, jadi saya telah membuat JSPerf head-to-head untuk kami uji: http://jsperf.com/days-in-month-head-to-head/5
Ia bekerja berdasarkan jawaban tahun kabisat saya di sini: javascript untuk menemukan tahun kabisat jawaban ini di sini Tahun kabisat periksa menggunakan operator bitwise (kecepatan luar biasa) serta logika biner berikut.
Pelajaran cepat dalam bulan biner:
Jika Anda mengartikan indeks bulan yang diinginkan (Jan = 1) dalam biner, Anda akan melihat bahwa bulan dengan 31 hari memiliki bit 3 clear dan bit 0 set, atau bit 3 set dan bit 0 clear.
Itu berarti Anda dapat menggeser nilai 3 tempat dengan
>> 3
, XOR bit dengan yang asli^ m
dan melihat apakah hasilnya menggunakan bit1
atau0
dalam posisi 0& 1
. Catatan: Ternyata+
sedikit lebih cepat daripada XOR (^
) dan(m >> 3) + m
memberikan hasil yang sama di bit 0.Hasil JSPerf : http://jsperf.com/days-in-month-perf-test/6
sumber
:)
Versi jawaban pertama yang saya poskan memang memiliki tanda kurung yang tidak diperlukan, yang dihapus (yang saya kreditkan kepada Anda) sehingga kami dapat mencukur karakter dan berakhir dengan yang ini. Aku masih bersyukur untuk hari yang menyenangkan itu, tepuk tangan!y
danm
variabel harus integer bukan string! Itu menyebabkan perhitungan yang salah misalnya untuk Februari mengembalikan 30. Saya harus menggunakanparseInt()
fungsi untuk membuatnya berfungsi.Kolega saya menemukan hal-hal berikut yang mungkin merupakan solusi yang lebih mudah
dicuri dari http://snippets.dzone.com/posts/show/2099
sumber
Sedikit modifikasi pada solusi yang disediakan oleh lebreeze :
sumber
return new Date(iYear, 1 + iMonth, 0).getDate();
setara dengan solusi @ lebreeze.Saya baru-baru ini harus melakukan sesuatu yang serupa, inilah yang saya buat:
Pass it in a date, dan itu akan mengembalikan tanggal yang diatur ke awal bulan, atau akhir bulan.
The
begninngOfMonth
fungsi cukup jelas, tapi apa yang terjadi di dalamendOfMonth
fungsi adalah bahwa aku incrementing bulan ke bulan berikutnya, dan kemudian menggunakansetDate(0)
untuk memutar kembali hari ke hari terakhir dari bulan sebelumnya yang merupakan bagian dari setDate spec:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate https://www.w3schools.com/jsref/jsref_setdate.asp
Saya kemudian mengatur jam / menit / detik ke akhir hari, sehingga jika Anda menggunakan semacam API yang mengharapkan rentang tanggal Anda akan dapat menangkap keseluruhan hari terakhir itu. Bagian itu mungkin melampaui apa yang diminta posting asli tetapi bisa membantu orang lain mencari solusi yang sama.
Sunting: Anda juga dapat bekerja ekstra dan menetapkan milidetik
setMilliseconds()
jika Anda ingin menjadi lebih tepat.sumber
coba yang ini.
contoh:
keluaran:
sumber
Ini bekerja untuk saya. Akan memberikan hari terakhir pada tahun dan bulan tertentu:
sumber
Ini berfungsi dengan baik:
sumber
Ini akan memberi Anda bulan saat ini hari pertama dan terakhir.
Jika Anda perlu mengubah 'tahun', hapus d.getFullYear () dan atur tahun Anda.
Jika Anda perlu mengubah 'bulan' hapus d.getMonth () dan atur tahun Anda.
sumber
Coba ini:
sumber
Fungsi di bawah ini memberikan hari terakhir bulan itu:
Demikian pula kita bisa mendapatkan hari pertama bulan ini:
sumber
sumber
sumber
atur bulan Anda harus berkencan dan kemudian atur hari ke nol, jadi bulan dimulai dari 1 - 31 dalam fungsi tanggal lalu dapatkan hari terakhir ^^
sumber
Berikut adalah jawaban yang menghemat GMT dan waktu tanggal awal
sumber
Saya tahu ini hanya masalah semantik, tetapi saya akhirnya menggunakannya dalam bentuk ini.
Karena fungsi diselesaikan dari argumen di dalam, di luar, ia berfungsi sama.
Anda kemudian dapat mengganti tahun, dan bulan / tahun dengan rincian yang diperlukan, apakah itu dari tanggal saat ini. Atau bulan / tahun tertentu.
sumber
Jika Anda membutuhkan akhir bulan dalam milidetik (misalnya dalam stempel waktu):
sumber