我正在使用Moment.js,这很棒。我现在遇到的问题是,我无法弄清楚如何获得某个特定日期的月份。我只能在Moment js docs中找到“一年中的一周”。例如,如果我选择今天的日期(2014年12月2日),我想知道这个日期是在2月的第二个星期,因此,它是本月的第二个星期三。有什么想法吗?
编辑: 我想有些澄清是必要的。我最需要的是一个月中某一天的第n个数字。例如,(来自评论)2014年2月1日将是该月的第一个星期六。 2014年2月3日将是本月的第一个星期一,尽管它在技术上是本月的第二周。基本上,谷歌日历的重复功能究竟是如何分类的。
答案 0 :(得分:30)
似乎moment.js没有实现您正在寻找的功能的方法。
但是,您可以使用Math.ceil
的{{1}}找到一个月中某一天的第n个数字
例如:
date / 7
看起来这是您正在寻找的号码,如以下测试所示
var firstFeb2014 = moment("2014-02-01"); //saturday
var day = firstFeb2014.day(); //6 = saturday
var nthOfMoth = Math.ceil(firstFeb2014.date() / 7); //1
var eightFeb2014 = moment("2014-02-08"); //saturday, the next one
console.log( Math.ceil(eightFeb2014.date() / 7) ); //prints 2, as expected
答案 1 :(得分:6)
根据给定日期计算月中的星期时,您必须考虑偏移量。并非所有月份都在一周的第一天开始。
如果您想考虑这个偏移量,如果您正在使用时间,可以使用类似下面的内容。
function weekOfMonth (input = moment()) {
const firstDayOfMonth = input.clone().startOf('month');
const firstDayOfWeek = firstDayOfMonth.clone().startOf('week');
const offset = firstDayOfMonth.diff(firstDayOfWeek, 'days');
return Math.ceil((input.date() + offset) / 7);
}
答案 2 :(得分:4)
简单使用moment.js
function week_of_month(date) { prefixes = [1,2,3,4,5]; return prefixes[0 | moment(date).date() / 7] }
答案 3 :(得分:3)
此库添加了函数moment.weekMonth()
https://github.com/c-trimm/moment-recur
答案 4 :(得分:2)
我认为现在响应有点晚了,但是我看不到与我相同的解决方案,因此我正在发布。
moment().weeks() - moment().add(0, 'month').startOf('month').weeks() + 1
“ moment()。weeks()”返回该年今天的周数。
“ moment()。add(0,'month')。startOf('month')。weeks()”返回该年该月第一天的周数
答案 5 :(得分:1)
我认为这个问题的答案会有所帮助,即使它没有按要求使用moment.js:
答案 6 :(得分:1)
function countWeekdayOccurrencesInMonth(date) {
var m = moment(date),
weekDay = m.day(),
yearDay = m.dayOfYear(),
count = 0;
m.startOf('month');
while (m.dayOfYear() <= yearDay) {
if (m.day() == weekDay) {
count++;
}
m.add('days', 1);
}
return count;
}
答案 7 :(得分:1)
@Daniel Earwicker答案存在问题。 我在我的应用程序中使用了他的函数,而while循环是无限的,因为以下情况:
我试图找出12月(2016年)的哪一周是第31天。 12月的第一天是一年中的第336天。 12月的最后一天是一年中的第366天。
问题在于:当它是第366天(12月31日,一年中的最后一天)时,代码在此日期又增加了一天。但是另外一天又添加了它将是2017年1月的第1天。因此循环永远不会结束。
{{1}}
我在代码中添加了以下行,以便解决问题:
{{1}}
它验证它是否仍然在被修改的同一年
答案 8 :(得分:0)
如下:
weekOfCurrentMonth = (moment().week() - (moment().month()*4));
这需要一年中的当前一周,并将其减去前几个月的4倍。哪个应该给你当月的一周
答案 9 :(得分:0)
这里的Robin Malfait解决方案是由轻量级库date-fns实现的
import {
differenceInDays,
startOfMonth,
startOfWeek,
getDate
} from 'date-fns'
const weekOfMonth = function (date) {
const firstDayOfMonth = startOfMonth(date)
const firstDayOfWeek = startOfWeek(firstDayOfMonth)
const offset = differenceInDays(firstDayOfMonth, firstDayOfWeek)
return Math.ceil((getDate(date) + offset) / 7)
}
export default weekOfMonth
答案 10 :(得分:0)
我将执行以下操作:
let todaysDate = moment(moment.now());
let endOfLastMonth = moment(get(this, 'todaysDate')).startOf('month').subtract(1, 'week');
let weekOfMonth = todaysDate.diff(endOfLastMonth, 'weeks');
得到todaysDate
和endOfLastMonth
,然后使用Moment内置的diff()
方法来计算当前月份的星期数。
答案 11 :(得分:0)
使用moment.js,
let count = 0;
for (let i = 1; i <= moment().daysInMonth(); i += 7) {
if (i < today.format('D')) {
count += 1;
}
else {
break;
}
};
count给出相对于月份中星期几的一天
答案 12 :(得分:0)