momentjs startOf ('month') не работает [дубликат]

Обратите внимание, что есть случаи, когда вы определили свой собственный пользовательский класс и хотите сохранить атрибуты, тогда вы должны использовать copy.copy() или copy.deepcopy(), а не альтернативы, например, в Python 3:

import copy

class MyList(list):
    pass

lst = MyList([1,2,3])

lst.name = 'custom list'

d = {
'original': lst,
'slicecopy' : lst[:],
'lstcopy' : lst.copy(),
'copycopy': copy.copy(lst),
'deepcopy': copy.deepcopy(lst)
}


for k,v in d.items():
    print('lst: {}'.format(k), end=', ')
    try:
        name = v.name
    except AttributeError:
        name = 'NA'
    print('name: {}'.format(name))

Выходы:

lst: original, name: custom list
lst: slicecopy, name: NA
lst: lstcopy, name: NA
lst: copycopy, name: custom list
lst: deepcopy, name: custom list
67
задан Fabio B. 30 September 2014 в 23:12
поделиться

9 ответов

Это потому, что 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 };
}

Ссылки:

125
ответ дан klyd 21 August 2018 в 11:35
поделиться
  • 1
    moment является идемпотентным, поэтому вы также можете использовать endDate = moment(starDate).endOf("month") ^. ^ – user633183 30 September 2014 в 23:33
  • 2
    Фактически, по умолчанию способ клонирования объекта в документации - moment(<value>). Обновлен пример использования некоторых из более коротких функций. – klyd 30 September 2014 в 23:39
  • 3
    Спасибо. Я потратил два часа, пытаясь понять, почему он не работает. – Leon 30 September 2015 в 00:44
  • 4
    в первый раз я когда-либо видел слово idempotent, используемое в Интернете! хорошо сделанный наомик – Mike 18 December 2015 в 15:30
  • 5
    add(-1,"month") не работает, когда его январь, и вы хотите получить прошлогодний месяц. – Akhoy 19 January 2017 в 14:31

Когда вы используете .endOf(), вы мутируете объект, на который он вызывается, поэтому startDate становится Sep 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) 
14
ответ дан bakkal 21 August 2018 в 11:35
поделиться

вы можете использовать это непосредственно для даты окончания или начала месяца

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

, вы можете изменить формат, указав новый формат

5
ответ дан candidJ 21 August 2018 в 11:35
поделиться
  • 1
    . Момент () endOf (& Quot; месяц & Quot;) формат (& Quot; ГГГГ-ДД-ММ & Quot;). – Scholle 12 December 2017 в 00:59

Не думайте, что есть какой-то прямой метод, чтобы получить последний день, но вы можете сделать что-то вроде этого:

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
ответ дан Community 21 August 2018 в 11:35
поделиться
var d = new moment();
var startMonth = d.clone().startOf('month');
var endMonth = d.clone().endOf('month');
console.log(startMonth, endMonth);

doc

0
ответ дан IfThenElse 21 August 2018 в 11:35
поделиться

Следующий код должен работать:

$('#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);
-1
ответ дан Joel 21 August 2018 в 11:35
поделиться
  • 1
    Пожалуйста, оставьте больше, чем просто коды, и не забудьте обернуть свои коды. – NoobTW 16 August 2018 в 18:34

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
ответ дан JSON C11 21 August 2018 в 11:35
поделиться

ваш startDate - это первый день месяца. В этом случае мы можем использовать

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

Надеемся, что это поможет !!

0
ответ дан nikhil 21 August 2018 в 11:35
поделиться
-1
ответ дан Valdi_Bo 1 November 2018 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: