angularjs - 仅使用JS获取一周内属于同一月份的天数
问题描述
我想找出属于同一个月的特定周的天数。例如,如果我提供周数和月份,则系统应提供属于给定周但也属于同一月份的总天数。2019 年的第 1 周包含从 12 月 30 日到 1 月 5 日的 7 天。因此,1 月第 1 周的总天数为 5 天。我使用以下代码来获取一周的开始和结束
Date.prototype.getWeekRange = function() {
var date = new Date(this.getTime());
date.setHours(0, 0, 0, 0);
// Thursday in current week decides the year.
date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
// January 4 is always in week 1.
var week1 = new Date(date.getFullYear(), 0, 4);
// Adjust to Thursday in week 1 and count number of weeks from date to week1.
return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);
}
function getDateRangeOfWeek(weekNo, y){
var d1, numOfdaysPastSinceLastMonday, rangeIsFrom, rangeIsTo;
var tmpRangeArry = [];
d1 = new Date(''+y+'');
numOfdaysPastSinceLastMonday = d1.getDay() - 1;
d1.setDate(d1.getDate() - numOfdaysPastSinceLastMonday);
d1.setDate(d1.getDate() + (7 * (weekNo - d1.getWeekRange())));
rangeIsFrom = (d1.getMonth() + 1) + "-" + d1.getDate() + "-" + d1.getFullYear();
d1.setDate(d1.getDate() + 6);
rangeIsTo = (d1.getMonth() + 1) + "-" + d1.getDate() + "-" + d1.getFullYear() ;
tmpRangeArry.push(rangeIsFrom);
tmpRangeArry.push(rangeIsTo);
return tmpRangeArry;
};
但我不知道如何从工作日中删除不同月份的日子
解决方案
这是您要实现的目标的最小可验证完整算法...在此代码中,一周从星期一开始。
- 对于周=5 和月=1... 我们得到答案:4(对于 1 月 28 日 - 1 月 31 日)
- 对于周=5 和月=2... 我们得到答案:3(对于 2 月 1 日 - 2 月 3 日)
下面的工作片段:
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.myWeek = 1;
$scope.myMonth = 1;
$scope.weekStartDate;
$scope.weekEndDate;
$scope.numberOfDaysFromThisMonth = 0;
$scope.getDateRangeOfWeek = function(w, m, y) {
$scope.numberOfDaysFromThisMonth = 0;
var d = (1 + (w - 1) * 7); // 1st of January + 7 days for each week
$scope.weekStartDate = new Date(2019, 0, d);
$scope.weekEndDate = new Date(2019, $scope.weekStartDate.getMonth(), $scope.weekStartDate.getDate() + 6);
for (var i = 0; i < 7; i++) {
let newDate = new Date(2019, $scope.weekStartDate.getMonth(), $scope.weekStartDate.getDate() + i - 1);
if ($scope.myMonth && newDate.getMonth() + 1 == m) {
$scope.numberOfDaysFromThisMonth = $scope.numberOfDaysFromThisMonth + 1;
}
}
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<div ng-app="myApp" ng-controller="myCtrl">
Enter the Week of the year in question: <input type="number" ng-model="myWeek"><br/>
Enter the Month for which you need the count of days: <input type="number" ng-model="myMonth"><br>
<br/>
<button type='button' ng-click="getDateRangeOfWeek(myWeek,myMonth, myYear)"> get date </button>
<br/><br/>
<b>Start of week</b>: {{ weekStartDate }} <br/>
<b>End of week</b>: {{ weekEndDate }} <br/> <br/> # of days for Month:{{ myMonth }} in Week:{{myWeek }} is: <mark>{{ numberOfDaysFromThisMonth }}</mark>
</div>
推荐阅读
- powerbi - 如何解决 Power BI Dataflow 中的突然错误 500
- c++ - 我可以通过将其转换为 char* 来序列化一个类吗?
- ruby - 如何求阶乘之和
- haskell - 生成包含类型族的 InstanceD 声明
- c++ - std::map:当元素不可默认构造时创建/替换元素
- css - 用引号括起来的角函数返回变量显示为文本而不是渲染/使用不破坏 css 的不同方案
- css - 使用 CSS 交换文本顺序
- react-native - 代码推送同步后使用深层链接反应原生
- datadog - Datadog 从另一个自定义指标创建自定义指标
- git - git:当有以后的提交时恢复合并