如何使用 moment.js 获取日期范围

Posted

技术标签:

【中文标题】如何使用 moment.js 获取日期范围【英文标题】:How to get date range using moment.js 【发布时间】:2016-10-06 23:59:10 【问题描述】:

这是我的html页面

<tr ng-show="option == 'Yearly' || option == 'Date'">
            <td>
                <label>From:</label>
            </td>
            <td>
                <input type="text" ng-model="fromdate" id="from" date-picker date-type="from" month-directive />
                fromdate
            </td>

            <td>
                <label>To:</label>
            </td>
            <td>
                <input id="todate" type="text" ng-model="todate" date-picker date-type="to" month-directive />
                todate
            </td>

        </tr>

这是我的指令

app.directive('monthDirective', function () 

return 

    restrict:'A',
    link: function (scope, elem) 
        var fromDate, toDate;
        scope.$watch('fromdate', function (newValue, oldValue) 
            fromDate = newValue;
            console.log('fromDate', newValue);
        );
        scope.$watch('todate', function (newValue, oldValue) 
            todate = newValue;
            console.log('todate', newValue);
        );

        var range = moment().range(fromDate, toDate);
        var diff = moment.preciseDiff(fromDate,toDate);
        console.log('Range', range);
        console.log('diff', diff);
    

)

我需要使用 mument.js 获取 fromdate 和 todate 之间的范围。任何人都可以建议如何在我的场景中执行此操作。提前致谢

【问题讨论】:

你在使用moment range扩展吗? 你想得到天数的差异吗? 不确定这与 Angular 有什么关系...... 预期结果是什么,您打算在哪里使用它? 我需要知道'fromdate'和'todate'之间的日期是什么 【参考方案1】:

要获取两个日期之间的其余日期,您可以参考此代码-

$scope.dateArr = []; //Array where rest of the dates will be stored

$scope.prevDate = moment().subtract(15, 'days');//15 days back date from today(This is the from date)

$scope.nextDate = moment().add(15, 'days');//Date after 15 days from today (This is the end date)

//extracting date from objects in MM-DD-YYYY format
$scope.prevDate = moment($scope.prevDate._d).format('MM-DD-YYYY');
$scope.nextDate = moment($scope.nextDate._d).format('MM-DD-YYYY');

//creating JS date objects
var start = new Date($scope.prevDate);
var end = new Date($scope.nextDate);

//Logic for getting rest of the dates between two dates("FromDate" to "EndDate")
while(start < end)
   $scope.dateArr.push(moment(start).format('ddd DD-MM'));
   var newDate = start.setDate(start.getDate() + 1);
   start = new Date(newDate);  


console.log('Dates:- ');
console.log($scope.dateArr);

这是控制台日志:-

[“周二 24-05”、“周三 25-05”、“周四 26-05”、“周五 27-05”、“周六 28-05”、“周日 29-05”、“周一 30-05”、“周二 31-05”、“周三 01-06”、“周四 02-06”、“周五 03-06”、“周六 04-06”、“周日 05-06”、“周一 06-06”、“周二 07-06”、“周三 08-06”、“周四 09-06”、“周五 10-06”、“周六 11-06”、“周日 12-06”、“周一 13-06”、“周二 14-06”、“周三 15-06”、“周四 16-06”、“周五 17-06”、“周六 18-06"、"Sun 19-06"、"Mon 20-06"、"Tue 21-06"、"Wed 22-06"]

【讨论】:

我想知道'fromdate'和'todate'之间的日期是什么 @SamDaniel 我已经编辑了代码。让我知道它是否适合你。 天哪,单行函数上有这么多代码,而这个是最好的答案?更好地检查我的答案【参考方案2】:

我知道这是一个古老的/已回答的问题,但由于它位于谷歌的顶部,这里是如何实现只有 moment 的日期范围(并且没有 moment-range):

import moment from 'moment'

/**
 * @param date|moment start The start date
 * @param date|moment end The end date
 * @param string type The range type. eg: 'days', 'hours' etc
 */
function getRange(startDate, endDate, type) 
  let fromDate = moment(startDate)
  let toDate = moment(endDate)
  let diff = toDate.diff(fromDate, type)
  let range = []
  for (let i = 0; i < diff; i++) 
    range.push(moment(startDate).add(i, type))
  
  return range

返回两者之间的每个“类型”(月/日/小时等)的数组,不包括结束日期

例子:

let range = getRange('2019-01-01', '2019-01-05', 'days')
// moment dates -> [ '2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04' ]

【讨论】:

范围中缺少最后一个日期【参考方案3】:

你可以做这样的事情来获得天数的差异:

var fromDate = moment();
var toDate = moment().add(15, 'days');

var range = moment().range(fromDate, toDate);
var diff = range.diff('days');

var array = range.toArray('days');
$.each(array, function(i, e) 
  $(".container").append("<li>" + moment(e).format("DD MM YYYY") + "</li>");
);

console.log('Range', range);
console.log('diff', diff);

编辑

我为toArray 函数添加了一个小例子:

https://jsfiddle.net/Tintin37/19n5ykzs/

【讨论】:

我想知道fromdate和todate之间的日期是什么 你可以使用 toArray 所以像这样range.toArray('days'); 你会得到一个日期数组,数组中的每一项都是你的开始日期和结束日期之间的日期 我收到一个错误,即 toArray 不是函数。有什么建议吗? 我将添加 .toArray() 已在 v3 中删除并替换为其他一些函数,如 Array.from(range.by('days'))`,请参见此处:github.com/rotaready/moment-range/issues/… 仅用于记录方法 range 是一个单独的 MomentJs 插件。安装它npm install moment-range 然后npm install moment-range 并添加到代码const Moment = require('moment'), MomentRange = require('moment-range'), moment = MomentRange.extendMoment(Moment);【参考方案4】:
const getDaysRange = (date1, date2) => 
  if (date1 && date2) 
    return Math.abs(moment(date2).diff(moment(date1), 'days')) + 1;
  

  return undefined;
;

【讨论】:

最好能解释一下为什么你的代码有效。 代码尽量简单,需要什么解释? 它甚至不起作用。它只是计算天数。不是范围。 @zola25 对我来说两个日期之间的天数 = 范围,作者没有具体说明他想要什么【参考方案5】:

如果你想获得两个日期之间的连续天数:

    安装 MomentJS 和 MomentRange:npm i moment &amp;&amp; npm i moment-range 一些代码
const Moment = require("moment"), MomentRange = require("moment-range"), moment = MomentRange.extendMoment(Moment); /*add plugin to moment instance*/ let range = moment().range("2018-02-20", "2018-03-01"), /*can handle leap year*/ array = Array.from(range.by("days")); /*days, hours, years, etc.*/ array.map(m => console.log(m.format("YYYY-MM-DD")); /*or any format you like*/ );

【讨论】:

以上是关于如何使用 moment.js 获取日期范围的主要内容,如果未能解决你的问题,请参考以下文章

moment.js,如何获取星期几

如何使用 Moment.js 从日期中删除时间?

使用 moment.js 设置可变日期值

如何将 Moment.js 日期转换为用户本地时区?

Moment.js 从日期获取日期名称

Moment js按星期和星期几获取一个月中的特定日期