У вас есть фундаментальное недопонимание объектов ECMAScript Date. Они представляют собой просто смещение от 1970-01-01T00: 00: 00Z и не имеют других связанных данных, таких как часовой пояс или смещение.
Выражение:
new Date((new Date).toLocaleString("en-US", {
timeZone: "Asia/Jakarta"
}));
(new Date)
создает date для текущего времени, вызов toLocaleString с параметрами дает метку времени для текущей даты и времени для местоположения «Азия / Джакарта».
Это затем анализируется включающим вызовом конструктора Date для создания Date для того же самого момента времени. Если полученная строка включает имя часового пояса или смещение для "Asia / Jakarta" (что может или не может быть, в зависимости от реализации), это то же самое, что:
new Date();
So getDay возвращает день для местного часового пояса, а не для "Азии / Джакарты". Также обратите внимание, что встроенный синтаксический анализатор может некорректно анализировать строку, возвращаемую toLocaleString , особенно там, где использовались параметры.
Если вы хотите использовать встроенные методы, обратите внимание на конструктор Intl.DateTimeFormat и метод formatToParts . Это вернет строковые значения для частей даты и времени для определенного репрезентативного местоположения, такого как «Азия / Джакарта». Затем вы можете делать что-то с частями, как с методами даты.
Обратите внимание, что некоторые части даты имеют разные имена по сравнению с соответствующими методами даты, также возвращаются имена дней, а не числа.
function checkDatetime(loc) {
let f = new Intl.DateTimeFormat('en', {
year : 'numeric',
month : '2-digit',
day : '2-digit',
weekday : 'short',
hour : '2-digit',
hour12 : false,
minute : '2-digit',
second : '2-digit',
timeZone: loc
});
let temp = f.formatToParts(new Date());
let parts = temp.reduce((acc, part) => {
if (part.type != 'literal') {
acc[part.type] = part.value;
}
return acc;
}, Object.create(null));
// Debug
console.log(parts);
return parts.weekday != 'Sat' && parts.weekday != 'Sun' &&
parts.hour >= 8 && parts.hour < 17;
}
console.log(checkDatetime('Asia/Jakarta'));