如何使用 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 && 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 获取日期范围的主要内容,如果未能解决你的问题,请参考以下文章