Оказывается, что это не совсем тривиальная задача с использованием JavaScript (как отмечено в ответе от @ StephenR , это может быть проще для решения на стороне сервера).И, как отмечено в некоторых комментариях, использование библиотеки может быть лучшим подходом для js.
Тем не менее, подумав немного о комментариях @ RobG относительно различной поддержки браузером таких опций, как timeZone
в toLocaleString
, мне было любопытно, что нужно сделать, чтобы решить эту проблемудругой способ (делает меня благодарным за различные библиотеки дат JS).Фрагмент ниже ...
let d = new Date(); // current datetime
let month = d.getUTCMonth(); // utc month (jan is 0)
let date = d.getUTCDate(); // utc date
let hour = d.getUTCHours(); // utc hours (midnight is 0)
let day = d.getUTCDay(); // utc weekday (sunday is 0)
let offset = 4; // assume EDT to start
let adjust = 1; // offset adjustment at DST
let mar = (month === 2); // march boolean
let nov = (month === 10); // november boolean
// handle march and november (DST change months)
if (mar || nov) {
if (mar) {
offset = 5; // assume EST to start
adjust = -1; // DST adjustment to EDT
}
// handle offset shift to prior day
if (hour - offset < 0) {
date -= 1;
day -= 1;
}
// handle date ranges when DST change may or may not have occurred yet
if ((mar && date > 7 && date < 15) || (nov && date < 8)) {
// DST adjustment on or after DST sunday at 2:00am
if (date >= date - day && hour - offset >= 2) {
offset += adjust;
}
// DST adjustment for dates after DST change has already occured
} else if ((mar && date > 14) || (nov && date > 7)) {
offset += adjust;
// handle EDT to EST offset shift to prior day (not already handled above)
if (nov && hour === 4) {
date -= 1;
day -= 1;
}
}
// handle months without DST changes
} else {
// EDT to EST adjustment for EST months
if (month < 2 || month > 10) {
offset += adjust;
}
// handle offset shift to prior day
if (hour < offset) {
day -= 1;
}
}
// get current timezone hour
if (hour >= offset) {
hour -= offset;
} else {
hour = hour - offset + 24;
}
// do something on weekdays between 8am and 6pm
if (day > 0 && day < 6 && hour > 7 && hour < 19) {
console.log('online'); // handle online
// do something else on nights and weekends
} else {
console.log('offline'); // handle offline
}