Momentjs,如何跳过星期日?

时间:2016-03-16 03:40:01

标签: javascript reactjs momentjs

我有一个条件,我必须从父组件发送一个子组件的开始和结束日期。

简单来说,我将向子组件发送开始日期和结束日期。 结束日期将添加到开始日期(可以是3,5,7)。 即如果开始日期为2016-01-01(要添加的变量为3),则结束日期为2016-01-03。

但是,我需要考虑另一个必须跳过星期天的情况。

假设2016-01-02是星期日,则结束日期应为2016-01-04。

开始日期在getInitialState()

中初始化
getInitialState(){
    variable_to_add:5,
    start_date: moment().format("YYYY-MM-DD"),
}
componentDidMount(){
this.setState({end_date:moment().add(Number(variable_to_add),'day').format("YYYY-MM-DD")
}
render(){
return <CallChild start_date={this.state.start_date} end_date={this.end_date}
    },

任何完成或改进上述代码的建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

你可以创建这样的函数来计算所需的日期:

function addDaysWithoutSundays(date, daysToAdd) {
 var tempEndDate = moment(date).add(daysToAdd, "day"),
     countSundaysBetweenDates = function (startDate, endDate) {          
         var daysDiff = endDate.diff(startDate, 'days');
         return Math.floor((startDate.day() + daysDiff)/ 7 );
     },
   countSundays = countSundaysBetweenDates(date, tempEndDate);      
   return moment(date).add(daysToAdd - countSundays, 'days');
}

你可以在这里试试JsFiddle(你可以在控制台找到结果)

答案 1 :(得分:0)

我最终使用Pure Javascript,并在Stack overflow Link的另一页中找到提示。

formatDate:function(date) {
    var d = new Date(date),
        month = '' + (d.getMonth() + 1),
        day = '' + d.getDate(),
        year = d.getFullYear();

    if (month.length < 2) month = '0' + month;
    if (day.length < 2) day = '0' + day;

    return [year, month, day].join('-');
},
addWeekdays:function(date, days) {
    var days = days-2;
    date.setDate(date.getDate()+2);
    var counter = 0;
        if(days > 0 ){
            while (counter < days) {
                date.setDate(date.getDate() + 1 ); // Add a day to get the date tomorrow
                var check = date.getDay(); // turns the date into a number (0 to 6)
                    if (check == 0) {
                        // Do nothing it's the weekend (0=Sun & 6=Sat)
                    }
                    else{
                        counter++;  // It's a weekday so increase the counter
                    }
            }
        }
    return this.formatDate(date);
},

我的getInitailState如下所示:

    getInitialState: function() {
    return {
        date_from: moment().isoWeekday(1).format("YYYY-MM-DD"),
        no_of_items : 7,
        start_date: moment().add(2,'day').format("YYYY-MM-DD"),
        value:0,
    };
},

我的渲染功能如下:

render(){
return <DayMenu weekday={(item.weekday).toString()} color={this.getRandomColor()} dataItem={dataItem} start_date={this.state.start_date} end_date={this.addWeekdays(new Date(this.state.start_date),this.state.no_of_items)}/>