如何在angularjs中获取每周明智的开始和结束日期

Posted

技术标签:

【中文标题】如何在angularjs中获取每周明智的开始和结束日期【英文标题】:How to get the Week wise Start and End date in angularjs 【发布时间】:2018-01-14 09:38:07 【问题描述】:

在我使用 npm 中的 angularjs-DatePicker 之前。

在这里,我可以从日期选择器中选择日期。但现在我必须将字段设置为 FromDateToDate 表示星期 StartDate 和 EndDate 应显示该周中的任何日期选择时间。

ex:在Calender 01-08-2017开始,因此,只要选择01到05的任何日期,那么两个字段应显示为01和Todate为06,并且只要用户选择31即可-07-2017 两个字段应显示为 7 月 30 日和 31 日。

我有一个想法在 DotNet 中从 FromDate Calender 控件 onchange 事件中实现 ToDate,如下面提到的代码

Convert.ToDouble(objstart.DayOfWeek)).ToString("dd-MM-yyyy")

但是如何在 angularjs 中实现这个用例。

谢谢

【问题讨论】:

如果你必须在javascript中做大量的日期操作,我推荐使用moment.js 从您的示例来看:您想要选择所选日期适合的星期。但星期的开始和结束应该始终在同一个月,并且星期从星期日开始。对吗? @Salketer 是的。但不是强制性的星期日作为默认的开始日期,即使我们保持星期一也没有问题。 【参考方案1】:

好的,所以我要做的是计算不同的日期,并根据一周的开始或结束来取最小值/最大值。

这里:

//Use the date received, UTC to prevent timezone making dates shift 
var pickedDate = new Date("08-03-2017UTC");
 
var startSunday = new Date(pickedDate);
startSunday.setDate(pickedDate.getDate() - pickedDate.getDay());
var startMonth = new Date(pickedDate);
startMonth.setDate(1);
var startDate = Math.max(startMonth,startSunday);

console.log("Start:" , new Date(startDate));

var endSaturday = new Date(pickedDate);
endSaturday.setDate(pickedDate.getDate() + (7-pickedDate.getDay()));
var endMonth = new Date(pickedDate);
endMonth.setMonth(pickedDate.getMonth()+1);//Add a month
endMonth.setDate(0);// to select last day of previous month.
var endDate = Math.min(endMonth,endSaturday);

console.log("End" , new Date(endDate));

诀窍是使用日期,找到所有可能的开始和结束日期,然后使用 Math.min 和 Math.max 选择正确的日期,这将使用它们的时间戳比较日期。

【讨论】:

感谢您的快速回答。让我试试这个。【参考方案2】:

JavaScript 中有非常好的库来处理日期操作。

https://github.com/datejs/Datejs

有一种方法

Date.parse('next friday')       // Returns the date of the next Friday.
Date.parse('last monday') 

使用这些方法,您可以根据当前周获取一周的开始和结束日期。

我希望它会有所帮助。

【讨论】:

这在某种程度上是可以接受的,但是当一个月的周末在星期二结束时,然后从这个函数中你编写的它将显示下个月的日期为星期五的 endDate。在这种情况下,它应该将开始日期显示为 sun 并将结束日期显示为 tue 本身 如果可能,请尝试在小提琴中显示,以便我可以轻松地将我的场景与您联系起来,感谢您的回答。 嗨 Charan,我可能无法清楚地理解这个问题。你到底需要什么。也许你可以写一些输入和预期出来,以便我能理解。【参考方案3】:

您可以使用库moment 轻松实现此目的。这个库中有很多有用的函数。

var selectedDate = moment('Mon Aug 10 2017');

//If you want to get the ISO week format(Monday to Sunday)
var weekStart = selectedDate.clone().startOf('isoweek').format('MMM Do');
var weekEnd = selectedDate.clone().endOf('isoweek').format('MMM Do');

//If you want to get the Sunday to Saturday week format
var weekStart = selectedDate.clone().startOf('week').format('MMM Do');
var weekEnd = selectedDate.clone().endOf('week').format('MMM Do');

【讨论】:

这很好,但我的情况不是关于周格式。当用户在 DatePicker 中选择任何日期时,它应该显示该周 startdate 和 endDate weekStart 的值为“Aug 7th”,weekEnd 的值为“Aug 13th”。希望这是你想要的,对吧?【参考方案4】:

这里不需要 angular 指令,你可以使用下面的 JavaScript 扩展。

//get week from date
Date.prototype.getWeekNumber = function (weekstart) 


    var target = new Date(this.valueOf());

    // Set default for weekstart and clamp to useful range        
    if (weekstart === undefined) weekstart = 1;
    weekstart %= 7;

    // Replaced offset of (6) with (7 - weekstart)
    var dayNr = (this.getDay() + 7 - weekstart) % 7;
    target.setDate(target.getDate() - dayNr + 0);//0 means friday

    var firstDay = target.valueOf();

    target.setMonth(0, 1);
    if (target.getDay() !== 4) 
        target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
    
    return 1 + Math.ceil((firstDay - target) / 604800000);;
;

//get date rance of week
Date.prototype.getDateRangeOfWeek = function (weekNo, weekstart) 

    var d1 = this;
    var firstDayOfWeek = eval(d1.getDay() - weekstart);
    d1.setDate(d1.getDate() - firstDayOfWeek);

    var weekNoToday = d1.getWeekNumber(weekstart);
    var weeksInTheFuture = eval(weekNo - weekNoToday);

    var date1 = angular.copy(d1);
    date1.setDate(date1.getDate() + eval(7 * weeksInTheFuture));
    if (d1.getFullYear() === date1.getFullYear()) 
        d1.setDate(d1.getDate() + eval(7 * weeksInTheFuture));
    

    var rangeIsFrom = eval(d1.getMonth() + 1) + "/" + d1.getDate() + "/" + d1.getFullYear();

    d1.setDate(d1.getDate() + 6);
    var rangeIsTo = eval(d1.getMonth() + 1) + "/" + d1.getDate() + "/" + d1.getFullYear();

    return  startDate: rangeIsFrom, endDate: rangeIsTo 
;

你的代码可以是这样的

 var startdate = '01-08-2017'
                var weekList = [];
                var year = startdate.getFullYear();
                var onejan = new Date(year, 0, 1);//first january is the first week of the year
                var weekstart = onejan.getDay();
                weekNumber = startdate.getWeekNumber(weekstart);

                //generate week number
                    var wkNumber = weekNumber;
                    var weekDateRange = onejan.getDateRangeOfWeek(wkNumber, weekstart);
                    var wk = 
                        value: wkNumber
                        , text: 'Week' + wkNumber.toString()
                        , weekStartDate: new Date(weekDateRange.startDate)
                        , weekEndDate: new Date(weekDateRange.endDate)
                    ;
                    weekList.push(wk);

【讨论】:

【参考方案5】:

我想这没有指令或过滤器,您需要自己创建一个。你可以从date-time-object引用日期对象

【讨论】:

以上是关于如何在angularjs中获取每周明智的开始和结束日期的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的日期与每周的开始/结束正确对齐?

PHP获取一年有几周以及每周开始日期和结束日期

PHP获取一年有几周以及每周开始日期和结束日期

根据传入的年份和月份获取该月属于本年的第几周和每周的开始和结束日期

php获取本周开始日期和结束日期的方法

SQL 查询 - 多个日期范围