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?

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:


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


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) 

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"));

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'));

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!!


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

dokter


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>


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.


-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);

-2

Coba kode berikut:

moment(startDate).startOf('months')
moment(startDate).endOf('months')

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.