片刻JS开始和给定月份结束

时间:2014-09-30 22:12:23

标签: javascript momentjs

我需要计算给定年份= 2014年和月份= 9(2014年9月)的JS日期。

我试过了:

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

两个日志都显示:

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

结束日期是正确的但是...为什么开始日期不是?

12 个答案:

答案 0 :(得分:144)

因为endOf会改变原始值。

相关引用:

  

通过将原始时刻设置为单位时间的结尾来突变原始时刻。

这是一个示例函数,可以为您提供所需的输出:

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

<强>参考文献:

答案 1 :(得分:15)

当您使用.endOf()时,您正在改变它所要求的对象,因此startDate将成为9月30日

您应该使用.clone()制作副本而不是更改

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) 

答案 2 :(得分:8)

您可以直接将其用于月末或开始日期

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

您可以通过定义新格式来更改格式

答案 3 :(得分:3)

尝试以下代码:

const moment=require('moment');
console.log("startDate=>",moment().startOf('month').format("YYYY-DD-MM"));
console.log("endDate=>",moment().endOf('month').format("YYYY-DD-MM"));

答案 4 :(得分:2)

不要认为有一些直接的方法来获得最后一天,但你可以这样做:

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

答案 5 :(得分:1)

你的startDate是第一天,在这种情况下我们可以使用

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

希望这会有所帮助!!

答案 6 :(得分:0)

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

doc

答案 7 :(得分:0)

&#13;
&#13;
javascript:void(location.href='whatsapp://send?text='+encodeURIComponent({{ product.whatsapp_text }}))
&#13;
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}`);
&#13;
&#13;
&#13;

答案 8 :(得分: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;
}

请注意,.clone()在momentjs中必不可少,否则它将覆盖该值。看来你的情况。

获取日期之间的一堆日期更为通用。

答案 9 :(得分:0)

尝试以下代码:

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

答案 10 :(得分:-1)

以下代码应该起作用:

$('#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);

答案 11 :(得分:-1)

这是一个简洁而准确的答案:

  // month in moment is 0 based, so 0 is actually january, subtract 1 to compensate.
  var startDate = moment([year, month - 1]).format()    
  var endDate = moment(startDate).clone().endOf('month').format()

示例

let month = 1         // January   
let year = 2021  

var startDate = moment([year, month - 1]).format()

var endDate = moment(startDate).clone().endOf('month').format()

console.log(startDate)
//2021-01-01T00:00:00-07:00

console.log(endDate)
//2021-01-31T23:59:59-07:00