例如,我想获取从现在到 30 天后每个星期五的日期。
目前,我可以使用 underscore 库和 moment.js 来做到这一点。但结果是 super 冗长和令人烦恼的程序/命令。观察:
var initDate = moment().day("Friday");
var endDate = moment().add(30, 'days');
var result = [];
result.push(initDate);
while (_.last(result).isBefore(endDate)) {
var x = _.last(result);
result.push(nextWeek(x));
}
alert(result); // answer here
// create a new moment from given moment and add 7 days
function nextWeek(initMoment) {
var x = moment(initMoment);
return x.add(7,'days');
}
这是相应的 fiddle :http://jsfiddle.net/aafsh5xa/
我想知道是否有一种方法可以使用类似 Haskell 的功能,例如列表推导式或无限列表(惰性求值)来使其更加简洁。也许是这样的:
var initDate = moment();
var endDate = moment().add(30,days);
var everyFriday = genLazyList(initDate, nextFridayFrom);
var result = _.filter(everyFriday, function(input){ return input.isBefore(endDate); });
请注意,everyFriday 是由 genLazyList 生成的无限列表,并且在调用 _.filter() 函数之前不会对其进行求值。 nextFridayFrom() 是 genLazyList 用于创建惰性列表的函数。
最佳答案
JS 有 Julian 日期库吗?这将使事情变得简单得多。
这里是一些伪 Haskell 代码,假设我们有以下函数:
toJulianDate :: Date -> Int
toDate :: Int -> Date
dayOfWeek :: Date -> Int -- 0 = Sun, 1 = Mon, ... 5 = Fri, etc.
然后我们可以这样写:
everyFridayBetween :: Date -> Date -> [Date]
everyDridayBetween d1 d2 = map toDate [jfriday, jfriday+7..j2]
where
j1 = toJulianDate d1
j2 = toJulianDate d2
dow = dayOfWeek d1
jfriday = if dow <= 5 then j1+(5-dow) else j1 + 7 + (5-dow)
关于javascript - 每个星期五直到某个日期,但以实用的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28792158/