获取 2 时间戳之间的一整天
get all day between 2 timestamp
我正在尝试获取 2 个时间戳和特定日期名称之间的所有日期。
我有一个 start1 是时刻(第一个日期),end1 是时刻(最后一个日期)。
我有一个带有 id (day) 的日期列表。
this.datesDailySelected = [];
var start1 = moment(new Date(this._data.row.plannedDispatch));
var end1 = moment(this.datesForm.controls["dailyExpiryDate"].value);
this.selectedItemsList.forEach((item) => {
var current = start1.clone();
var day;
switch (item.name) {
case "Sunday":
day = 0;
break;
case "Monday":
day = 1;
break;
case "Tuesday":
day = 2;
break;
case "Wednesday":
day = 3;
break;
case "Thursday":
day = 4;
break;
case "Friday":
day = 5;
break;
case "Saturday":
day = 6;
break;
}
while (current.day(7 + day).isBefore(end1)) {
this.datesDailySelected.push(current.clone().format("YYYY-MM-DD"));
}
console.log(this.datesDailySelected);
});
无论我在哪里选择 2 个日期和一个特定的日期名称示例(星期五),我都会检索本周没有一天的所有日期!
我的代码有问题。
真实例子:
start1 : "2021-12-20T07:50:00.000Z"
end1: "2021-12-25T07:50:00.000Z"
day choosed: friday with day = 5
output = empty list.
output must be ["2021-12-24"]
示例时间戳是 UTC,但工作是使用本地日期,因此以下内容也是如此。这可能会在具有不同时区偏移量的主机上产生不同的结果。如果你想要所有UTC,那么只需将所有方法更改为UTC方法(setHours to setUTCHours, getDate 到 getUTCDate,等等)。
您可以使用数组和 indexOf 而不是长开关块,更简单地将日期名称转换为数字。
获取特定日期的第一个实例也相当简单,但您必须检查它是否在开始之前(例如,如果日期范围是星期四到星期一并且您想要星期日,那么算法会发现星期四之前的太阳,而不是之后)。所以有一个检查,如果它在开始之前,则增加一周。
然后只需检查结束日期并将时间戳推入每一天的结果数组,然后添加 7 天,等等。
您可以使用库来完成这一切,但在普通 JS 中并不难:
function getDaysBetween(d1, d2, day) {
// Convert day name to number
let days = ['su','mo','tu','we','th','fr','sa'];
let dayNum = days.indexOf(day.toLowerCase().substr(0,2));
// Convert timestamps to Dates and set to start of day
let start = new Date(d1);
start.setHours(0,0,0,0);
let end = new Date(d2);
end.setHours(0,0,0,0);
// Get first instance of day name in same week as start
let d = new Date(start);
d.setDate(d.getDate() - d.getDay() + dayNum);
// If before start, add 7 days
if (d < start) d.setDate(d.getDate() + 7);
let result = [];
while (d <= end) {
result.push(d.toLocaleDateString('en-CA'));
d.setDate(d.getDate() + 7)
}
return result;
}
let start = '2021-12-20T07:50:00.000Z';
let end = '2021-12-25T07:50:00.000Z';
let day = 'Friday';
console.log(getDaysBetween(start, end, day));
我正在尝试获取 2 个时间戳和特定日期名称之间的所有日期。
我有一个 start1 是时刻(第一个日期),end1 是时刻(最后一个日期)。 我有一个带有 id (day) 的日期列表。
this.datesDailySelected = [];
var start1 = moment(new Date(this._data.row.plannedDispatch));
var end1 = moment(this.datesForm.controls["dailyExpiryDate"].value);
this.selectedItemsList.forEach((item) => {
var current = start1.clone();
var day;
switch (item.name) {
case "Sunday":
day = 0;
break;
case "Monday":
day = 1;
break;
case "Tuesday":
day = 2;
break;
case "Wednesday":
day = 3;
break;
case "Thursday":
day = 4;
break;
case "Friday":
day = 5;
break;
case "Saturday":
day = 6;
break;
}
while (current.day(7 + day).isBefore(end1)) {
this.datesDailySelected.push(current.clone().format("YYYY-MM-DD"));
}
console.log(this.datesDailySelected);
});
无论我在哪里选择 2 个日期和一个特定的日期名称示例(星期五),我都会检索本周没有一天的所有日期!
我的代码有问题。
真实例子:
start1 : "2021-12-20T07:50:00.000Z"
end1: "2021-12-25T07:50:00.000Z"
day choosed: friday with day = 5
output = empty list.
output must be ["2021-12-24"]
示例时间戳是 UTC,但工作是使用本地日期,因此以下内容也是如此。这可能会在具有不同时区偏移量的主机上产生不同的结果。如果你想要所有UTC,那么只需将所有方法更改为UTC方法(setHours to setUTCHours, getDate 到 getUTCDate,等等)。
您可以使用数组和 indexOf 而不是长开关块,更简单地将日期名称转换为数字。
获取特定日期的第一个实例也相当简单,但您必须检查它是否在开始之前(例如,如果日期范围是星期四到星期一并且您想要星期日,那么算法会发现星期四之前的太阳,而不是之后)。所以有一个检查,如果它在开始之前,则增加一周。
然后只需检查结束日期并将时间戳推入每一天的结果数组,然后添加 7 天,等等。
您可以使用库来完成这一切,但在普通 JS 中并不难:
function getDaysBetween(d1, d2, day) {
// Convert day name to number
let days = ['su','mo','tu','we','th','fr','sa'];
let dayNum = days.indexOf(day.toLowerCase().substr(0,2));
// Convert timestamps to Dates and set to start of day
let start = new Date(d1);
start.setHours(0,0,0,0);
let end = new Date(d2);
end.setHours(0,0,0,0);
// Get first instance of day name in same week as start
let d = new Date(start);
d.setDate(d.getDate() - d.getDay() + dayNum);
// If before start, add 7 days
if (d < start) d.setDate(d.getDate() + 7);
let result = [];
while (d <= end) {
result.push(d.toLocaleDateString('en-CA'));
d.setDate(d.getDate() + 7)
}
return result;
}
let start = '2021-12-20T07:50:00.000Z';
let end = '2021-12-25T07:50:00.000Z';
let day = 'Friday';
console.log(getDaysBetween(start, end, day));