Se han hecho preguntas similares, pero por alguna razón no puedo entender esto. Quiero que un usuario de cualquier parte del mundo vea si una tienda está abierta o cerrada en mi sitio. El horario de la tienda es de lunes a viernes de 8 am a 8 pm y sábados y domingos de 8 am a 7 pm.
Básicamente, el código necesita tomar la hora local de los usuarios y compararla con la hora actual en CT, y ver si la tienda está abierta. Esto se complica un poco más por el hecho de que si son las 7 p.
En toda la búsqueda que hice, encontré fragmentos de preguntas/respuestas similares, pero no puedo entender cómo ponerlo todo junto para encontrar una solución. Empecé probando esto:
var currTimeTokyo = moment.tz(moment(), 'Asia/Tokyo').format(); var currTimeCT = moment.tz(moment(), 'America/Chicago').format(); console.log(currTimeTokyo); console.log(currTimeCT);y eso da:
2021-10-30T00:51:42+09:00 2021-10-29T10:51:42-05:00Esos son correctos, pero ahora, ¿cómo me comparo con el horario de apertura/cierre de hoy? Necesito verificar si la hora de Tokio está entre la apertura y el cierre en CT, pero las horas de apertura/cierre cambian según el día que sea, y Tokio podría ser un día diferente al de CT de todos modos. ¿Cómo explicarías todo eso?
ACTUALIZACIÓN: Encontré algo que funcionó y lo publiqué como respuesta.
No sé moment.js y creo que ya se anunció como obsoleto (day.js o luxon serían alternativas actuales), por lo que no puedo darle la sintaxis adecuada, pero trato de ayudar con la lógica.
Investigué Luxon como sugirió Corrl y se me ocurrió esto, que creo que resuelve mi problema.
// open hours are MF 8am-8pm, Sat-Sun 8am-7pm (all times CT) var hours = [ { day: 'Sunday', open:8, close:19 }, { day: 'Monday', open:8, close:20 }, { day: 'Tuesday', open:8, close:20 }, { day: 'Wednesday', open:8, close:20 }, { day: 'Thursday', open:8, close:20 }, { day: 'Friday', open:8, close:20 }, { day: 'Saturday', open:8, close:19 } ]; var isOpen = false; var local = luxon.DateTime.local(); // get current time in local tz var localInCT = local.setZone("America/Chicago"); // rezone to CT without changing timestamp; hours.forEach(function(item, index){ if (index === localInCT.weekday && localInCT.hour >= item.open && localInCT.hour < item.close) { isOpen = true; } }); console.log(isOpen);