Momen JS dimulai dan akhir bulan tertentu

96

Saya perlu menghitung tanggal JS yang diberikan tahun = 2014 dan bulan = 9 (September 2014).

Saya mencoba ini:

var moment = require('moment');
var startDate = moment( year+'-'+month+'-'+01 + ' 00:00:00' );
            var endDate = startDate.endOf('month');
            console.log(startDate.toDate());
            console.log(endDate.toDate());

Kedua log menunjukkan:

Tue Sep 30 2014 23:59:59 GMT+0200 (CEST)
Tue Sep 30 2014 23:59:59 GMT+0200 (CEST)

Tanggal akhir benar tapi ... mengapa tanggal mulai tidak?

Fabio B.
sumber

Jawaban:

183

Itu karena endOfmengubah nilai aslinya.

Kutipan yang relevan:

Mutasi momen asli dengan menyetelnya ke akhir satuan waktu.

Berikut adalah contoh fungsi yang memberikan keluaran yang Anda inginkan:

function getMonthDateRange(year, month) {
    var moment = require('moment');

    // month in moment is 0 based, so 9 is actually october, subtract 1 to compensate
    // array is 'year', 'month', 'day', etc
    var startDate = moment([year, month - 1]);

    // Clone the value before .endOf()
    var endDate = moment(startDate).endOf('month');

    // just for demonstration:
    console.log(startDate.toDate());
    console.log(endDate.toDate());

    // make sure to call toDate() for plain JavaScript date type
    return { start: startDate, end: endDate };
}

Referensi:

klyd
sumber
4
momentidempoten sehingga Anda juga dapat menggunakan endDate = moment(starDate).endOf("month") ^. ^
Terima kasih
1
Sebenarnya, cara default untuk mengkloning suatu objek dalam dokumentasi adalah moment(<value>). Memperbarui contoh untuk menggunakan beberapa fungsi yang lebih pendek.
klyd
1
Terima kasih. Saya menghabiskan dua jam mencoba mencari tahu mengapa itu tidak berhasil.
Leon
1
pertama kali saya pernah melihat kata idempoten digunakan di web !! dilakukan dengan baik naomik
Mike
add(-1,"month")tidak berfungsi saat bulan Januari dan Anda ingin mendapatkan bulan tahun lalu.
Akhoy
21

Anda dapat menggunakan ini secara langsung untuk akhir atau tanggal mulai bulan tersebut

new moment().startOf('month').format("YYYY-DD-MM");
new moment().endOf("month").format("YYYY-DD-MM");

Anda dapat mengubah format dengan menentukan format baru

Shakti Jadon
sumber
16

Saat Anda menggunakan, .endOf()Anda memutasi objek yang dipanggil, jadi startDatemenjadi 30 Sep

Anda harus menggunakan .clone()untuk membuat salinannya daripada mengubahnya

var startDate = moment(year + '-' + month + '-' + 01 + ' 00:00:00');
            var endDate = startDate.clone().endOf('month');
            console.log(startDate.toDate());
            console.log(endDate.toDate());

Mon Sep 01 2014 00:00:00 GMT+0700 (ICT) 
Tue Sep 30 2014 23:59:59 GMT+0700 (ICT) 
bakkal
sumber
5

Coba kode berikut:

const moment=require('moment');
console.log("startDate=>",moment().startOf('month').format("YYYY-DD-MM"));
console.log("endDate=>",moment().endOf('month').format("YYYY-DD-MM"));
Sanjay Singh
sumber
1
Anda harus menambahkan beberapa konteks dengan kode Anda untuk menjelaskan mengapa dan bagaimana hal itu akan menyelesaikan masalah
ᴄʀᴏᴢᴇᴛ
3

Jangan benar-benar berpikir ada beberapa metode langsung untuk mendapatkan hari terakhir tetapi Anda dapat melakukan sesuatu seperti ini:

var dateInst = new moment();
/**
 * adding 1 month from the present month and then subtracting 1 day, 
 * So you would get the last day of this month 
 */
dateInst.add(1, 'months').date(1).subtract(1, 'days');
/* printing the last day of this month's date */
console.log(dateInst.format('YYYY MM DD'));
Sandeep Gantait
sumber
2

startDate Anda adalah hari pertama setiap bulan, Dalam hal ini kita dapat menggunakan

var endDate = moment(startDate).add(1, 'months').subtract(1, 'days');

Semoga ini membantu!!

nikhil
sumber
0
var d = new moment();
var startMonth = d.clone().startOf('month');
var endMonth = d.clone().endOf('month');
console.log(startMonth, endMonth);

dokter

IfThenElse
sumber
0

const year = 2014;
const month = 09;

// months start at index 0 in momentjs, so we subtract 1
const startDate = moment([year, month - 1, 01]).format("YYYY-MM-DD");

// get the number of days for this month
const daysInMonth = moment(startDate).daysInMonth();

// we are adding the days in this month to the start date (minus the first day)
const endDate = moment(startDate).add(daysInMonth - 1, 'days').format("YYYY-MM-DD");

console.log(`start date: ${startDate}`);
console.log(`end date:   ${endDate}`);
<script
src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js">
</script>

JSON C11
sumber
0
const dates = getDatesFromDateRange("2014-05-02", "2018-05-12", "YYYY/MM/DD", 1);           
console.log(dates);
// you get the whole from-to date ranges as per parameters
var onlyStartDates = dates.map(dateObj => dateObj["to"]);
console.log(onlyStartDates);
// moreover, if you want only from dates then you can grab by "map" function

function getDatesFromDateRange( startDate, endDate, format, counter ) {
    startDate = moment(startDate, format);
    endDate = moment(endDate, format);

    let dates = [];
    let fromDate = startDate.clone();
    let toDate = fromDate.clone().add(counter, "month").startOf("month").add(-1, "day");
    do {
        dates.push({
            "from": fromDate.format(format),
            "to": ( toDate < endDate ) ? toDate.format(format) : endDate.format(format)
        });
        fromDate = moment(toDate, format).add(1, "day").clone();
        toDate = fromDate.clone().add(counter, "month").startOf("month").add(-1, "day");
    } while ( fromDate < endDate );
    return dates;
}

Harap dicatat, .clone () sangat penting di momentjs lain itu akan menimpa nilainya. Sepertinya dalam kasus Anda.

Ini lebih umum, untuk mendapatkan banyak tanggal yang jatuh di antara tanggal.

bharat patel
sumber
-2

Kode berikut seharusnya berfungsi:

$('#reportrange').daterangepicker({
                startDate: start,
                endDate: end,
                ranges: {
                    'Hoy': [moment(), moment()],
                    'Ayer': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
                    'Ultimos 7 dias': [moment().subtract(6, 'days'), moment()],
                    'Ultimos 30 dias': [moment().subtract(29, 'days'), moment()],
                    'Mes actual': [moment().startOf('month'), moment().endOf('month')],
                    'Ultimo mes': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
                    'Enero': [moment().month(0).startOf('month') , moment().month(0).endOf('month')],
                    'Febrero': [moment().month(1).startOf('month') , moment().month(1).endOf('month')],
                    'Marzo': [moment().month(2).startOf('month') , moment().month(2).endOf('month')],
                    'Abril': [moment().month(3).startOf('month') , moment().month(3).endOf('month')],
                    'Mayo': [moment().month(4).startOf('month') , moment().month(4).endOf('month')],
                    'Junio': [moment().month(5).startOf('month') , moment().month(5).endOf('month')],
                    'Julio': [moment().month(6).startOf('month') , moment().month(6).endOf('month')],
                    'Agosto': [moment().month(7).startOf('month') , moment().month(7).endOf('month')],
                    'Septiembre': [moment().month(8).startOf('month') , moment().month(8).endOf('month')],
                    'Octubre': [moment().month(9).startOf('month') , moment().month(9).endOf('month')],
                    'Noviembre': [moment().month(10).startOf('month') , moment().month(10).endOf('month')],
                    'Diciembre': [moment().month(11).startOf('month') , moment().month(11).endOf('month')]
                }
            }, cb);
enrique ramos
sumber
-2

Coba kode berikut:

moment(startDate).startOf('months')
moment(startDate).endOf('months')
sacmii
sumber
2
Selamat datang di Stack Overflow. Ada sepuluh jawaban lain untuk pertanyaan ini; ada baiknya Anda menjelaskan mengapa milik Anda lebih baik atau lebih disukai daripada yang lain.
chb
itu tidak memberikan yang diharapkan o / p
Shyam