所以我使用 Zendesk API 來獲取實體的調度,API 回傳一個物件,其中包含一個名為 interval 的陣列,如下所示:
[
{ "start_time": 1980, "end_time": 2460 },
{ "start_time": 3420, "end_time": 3900 },
{ "start_time": 4860, "end_time": 5340 },
{ "start_time": 6300, "end_time": 6780 },
{ "start_time": 7740, "end_time": 8220 }
]
此示例僅轉換為一周中每個作業日的上午 9 點到下午 5 點(以分鐘為單位),該值以自一周開始(實際上是周日午夜)以來的分鐘為單位(意味著 720 的值將是周日中午)。
我正在嘗試實作一些服務器端邏輯,回圈遍歷間隔并檢查當前時間是否在給定日期的間隔之間,從而可以檢測它當前是否在營業時間內。
我在想 moment.js 庫可能對此有用,我一直在玩.startOf('week')和.diff()功能,但我一直被阻止,我擔心它可能不像我想要的那么可靠,因為我不確定每周從星期一或星期日開始。
到目前為止我有
let isBusinessHours = false;
function checkBusinessHours() {
intervals.map((interval, key) => {
//offset weekdays to match interval keys
let currentDay = moment().weekday() -1;
//create comparison start & end times based on interval start & end times
let startTime = moment().startOf('week').add(interval.start_time, 'minutes');
let endTime = moment().startOf('week').add(interval.end_time, 'minutes');
//check to see if it's business hours
if (moment().isBetween(startTime, endTime) && currentDay === key) {
isBusinessHours = true;
}
})
return isBusinessHours;
}
但我不確定這是否是檢查這個的最佳方法?
uj5u.com熱心網友回復:
在遵守夏令時的地方使用從星期日開始的偏移量似乎不是一個好主意。大多數地方都使用星期日作為轉換日,因此在那些日子里,星期天不是 24 小時,那一周的所有偏移量將是 ± 以分鐘為單位的 DST 偏移。
忽略這個問題,將日期轉換為偏移量相當簡單:減去前一個星期日,然后將差值除以一分鐘內的毫秒數。從偏移量轉換為日期是相反的:將分鐘添加到上一個星期日的日期,例如
// Return Date for start of Sunday 00:00 before d
function startOfWeek(d = new Date()) {
return new Date(d.getFullYear(), d.getMonth(), d.getDate() - d.getDay());
}
// Convert a Date to an offset in minutes
// from start of previous Sunday
function dateToOffset(d = new Date()) {
return Math.floor((d - startOfWeek(d)) / 6e4);
}
// Convert an offset to date, default is current week
// Week starts on Sunday
function offsetToDate(offset, d = new Date()) {
let date = startOfWeek(d);
date.setMinutes(offset);
return date;
}
// Examples
// Just a helper to format dates
function format(d) {
return d.toLocaleString('en', {
weekday: 'short',
hour: '2-digit',
hour12: false,
minute: '2-digit'
});
}
// Show current offset
let d = new Date();
console.log(`For ${format(d)} the offset is ${dateToOffset(d)}`);
// Convert offsets to dates
let data = [
{ "start_time": 1980, "end_time": 2460 },
{ "start_time": 3420, "end_time": 3900 },
{ "start_time": 4860, "end_time": 5340 },
{ "start_time": 6300, "end_time": 6780 },
{ "start_time": 7740, "end_time": 8220 }
];
data.forEach(o => console.log(
`Start: ${format(offsetToDate(o.start_time))} `
`End : ${format(offsetToDate(o.end_time))}`
));
// Find out if dates are between a start and end
[new Date(2021,10,25,12), // Thu 25 Nov 12:00
new Date(2021,10,27,12), // Sat 25 Nov 12:00
new Date() // Now
].forEach(d => {
let offset = dateToOffset(d);
console.log(
`Is ${format(d)} between a start and end? `
`${!!data.find(obj => obj.start_time <= offset && obj.end_time > offset)? 'Yes' : 'No'}`
)
});
uj5u.com熱心網友回復:
您可以獲得一周的開始,然后將 start_time 和 end_time 分鐘添加到它,這將為您提供調整后的 Date 物件,然后您可以使用它與當前日期進行比較。
我使用date- fns 而不是 moment.js,但如果需要,您可以翻譯代碼。
const { startOfWeek, add, compareAsc, compareDesc } = require("date-fns")
const intervals = [
{ "start_time": 1980, "end_time": 2460 },
{ "start_time": 3420, "end_time": 3900 },
{ "start_time": 4860, "end_time": 5340 },
{ "start_time": 6300, "end_time": 6780 },
{ "start_time": 7740, "end_time": 8220 }
]
const startOfWeekDate = startOfWeek(new Date());
const now = new Date();
let isBusinessHour = false;
for (let i = 0; i < intervals.length; i ) {
const startTime = add(startOfWeekDate, { minutes: intervals[i].start_time });
const endTime = add(startOfWeekDate, { minutes: intervals[i].end_time });
if (compareAsc(now, startTime) === 1 && compareDesc(now, endTime) === 1) {
isBusinessHour = true;
}
}
console.log("isBusinessHour", isBusinessHour)
請注意,startOfWeek函式接受第二個引數來指定一周??的開始日期(通常是星期日或星期一)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/366598.html
標籤:javascript 节点.js 约会时间 瞬间 zendesk-api
下一篇:計算從X到Y的完成百分比
