Estoy tratando de ocultar los listados de casas abiertas en mi mapa que ya han ocurrido. La única información de fecha que tengo se ve así:
Public: Sat Sep 18, 10:00AM-2:00PMNecesito poder comparar esta fecha con la de hoy para poder crear una declaración if para ocultar las jornadas de puertas abiertas vencidas.
Usando este código pude cortar el texto inicial:
const str = 'Public: Thu Feb 11, 10:00AM-2:00PM'; const opdate = (str.substr(8)); console.log(opdate); // Displays "Thu Feb 11, 10:00AM-2:00PM"Aquí es donde ahora estoy atascado... No puedo encontrar la manera de convertir esto a otro formato para poder compararlo con la fecha de hoy. Falta el año, lo que estoy seguro causará problemas hacia el final de cada año, y tiene una hora de finalización que realmente no es necesaria, ya que solo necesito comparar la fecha real con la fecha de hoy.
Puede crear una marca de tiempo para la fecha en el mismo formato que la marca de tiempo que tiene y ver si está en la cadena, por ejemplo
// Return date in format DDD MMM D, eg Thu Feb 11 function openHouseFormat(date = new Date()) { let {month, weekday, day} = new Intl.DateTimeFormat('en',{ weekday:'short', month: 'short', day: 'numeric' }).formatToParts(date).reduce((obj, part) => { obj[part.type] = part.value; return obj; }, {}); return `${weekday} ${month} ${day}`; } // Check if date is in string, eg // is Thu Feb 11 in Public: Thu Feb 11, 10:00AM-2:00PM function isSameDay(openHouseDate, date = new Date()) { return new RegExp(openHouseFormat(date)).test(openHouseDate); } // Date to test let openHouseDate = 'Public: Thu Feb 11, 10:00AM-2:00PM'; console.log(isSameDay(openHouseDate, new Date(2021,1,11))); // true // Test today, ie not 2021-02-11 console.log(isSameDay(openHouseDate, new Date())); // falseEn lugar de una expresión regular, podría usar indexOf , que podría ser un poco más eficiente.
Dado que la fecha de "puertas abiertas" es una subcadena de Date.prototype.toString , puede simplificar las cosas para:
function isSameDate(publicString, date = new Date()) { return publicString.indexOf(date.toString().slice(0,10)) != -1; } // Example let publicString = 'Public: Sat Sep 18, 10:00AM-2:00PM'; [new Date(2021,8,18), // 18 Sep new Date() // today ].forEach(d => console.log(isSameDate(publicString, d)));El año realmente no es necesario ya que el "sábado 18 de septiembre" solo ocurrirá aproximadamente una vez cada 7 años (el último fue en 2014, el próximo es en 2027).
algo como eso ?
let {open,close} = get_OpenCloseDates('Public: Thu Feb 11, 10:00AM-2:00PM') console.log( 'open ->', open.toLocaleString() ) console.log( 'close ->', close.toLocaleString() ) function get_OpenCloseDates( str ) { let year = new Date().getFullYear() , [wD,mth,d,h1,m1,h2,m2] = str.substr(8).split(/[\s,-]+|:/) ; return ({open: cDate(mth,d,h1,m1,year), close: cDate(mth,d,h2,m2,year)}) function cDate(mth,d,h,m,y) { let mN = new Date(`${mth} 1, ${y}`).getMonth() return new Date( y, mN, +d, +h +(m.includes('PM')?12:0),parseInt(m),0) } }Bien, aquí está la solución que se me ocurrió y que se basó en la primera sugerencia de @Mister Jojo. Esto toma mi fecha mal formateada, agrega el año actual y luego la compara con hoy para que pueda hacer una regla if else. Gracias por la ayuda de todos. Me encanta este sitio.
const str = 'Public: Tue Dec 21, 10:00AM-2:00PM'; const [weekday,month,day,h1,h2] = str.substr(8).split(/[\s,-]+/); var d = new Date(); var n = d.getFullYear(); var openhousedate = [month,day, n].join(" "); var formatted = openhousedate; //results in MMM DD YYYY const javaScriptRelease = Date.parse(formatted); const javaScriptRelease2 = Date.parse("2021/09/20"); document.write(javaScriptRelease + "<br>"); document.write(javaScriptRelease2 + "<br>"); console.log(javaScriptRelease2); if (javaScriptRelease2 > javaScriptRelease) { document.write(' its in the past '); } else { document.write(' open house is coming up '); }