Repository navigation
fix: las fechas de entrega salían un día antes al oeste de UTC - #96
Merged
Merged
Conversation
`due_date` se guarda como '2026-09-09', un día del calendario sin zona, y `deSQLite()` le añadía la `Z` de las marcas de CURRENT_TIMESTAMP: pasaba a medianoche UTC, que en Bogotá es el día 8 por la tarde. La tarjeta y el modal enseñaban «Sep 8, 2026» para una entrega del 9. Ahora una fecha solo-día se lee como la medianoche local de ese día, y `diaDeCalendario()` la devuelve tal cual para el <input type="date"> y para `vencida()`. Las marcas de tiempo siguen siendo UTC. El modal, además, recalculaba «vencida» a mano y daba por vencida una entrega de hoy desde las 00:00; ahora usa `vencida()` como la tarjeta. Pruebas unitarias en America/Bogota y Asia/Tokyo, y el e2e fija el día exacto, con servidor y navegador en Bogotá: en UTC, la zona de CI, el fallo no se veía. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # CHANGELOG.md # package-lock.json # package.json
This was referenced Oct 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Qué pasaba
Una entrega puesta para el 9 de septiembre se veía «Sep 8, 2026» en Colombia.
issues.due_datese guarda como'2026-09-09'(un día del calendario, sin hora ni zona) ydeSQLite()le añadía laZque sí necesitan las marcas deCURRENT_TIMESTAMP. Así pasaba a medianoche UTC, que en Bogotá (UTC−5) son las siete de la tarde del día 8. Ocurría en la tarjeta que pinta el servidor (IssueCard.astro) y, desde la 1.27.1, también en el modal, porque los dos usanfecha().Cambios
src/lib/fechas.ts:deSQLite()lee las fechas solo-día como la medianoche local de ese día, y rechaza los días que no existen (2026-02-30daba el 2 de marzo). Las marcas de tiempo no cambian: siguen siendo UTC.diaDeCalendario()(nueva): devuelve una fecha solo-día tal cual, y una marca de tiempo como el día local de ese instante. La usanvencida()y el<input type="date">del modal, que antes hacíanew Date(x).toISOString().split('T')[0]y sacaba el día en UTC.new Date(iso + 'T00:00:00') < new Date(), que la da por vencida desde la medianoche. Ahora usavencida(), igual que la tarjeta servida.TaskTable) y el contador de vencidas del Hub ya pasaban porfecha()/vencida(), así que quedan arreglados con el mismo cambio. La ordenación por fecha compara cadenas y no se movía.Pruebas
tests/fechas-solo-dia.test.ts: los mismos casos enAmerica/BogotayAsia/Tokyo, con una comprobación previa de que el cambio de zona se aplicó de verdad. Con el código anterior fallan 10 de 16.tests/e2e/fecha-y-cancelar.spec.tsahora fija el día exacto (9 en la tarjeta servida, 10 después de editar en el modal).playwright.config.tsarranca el servidor conTZ=America/Bogotay la prueba fijatimezoneId: en UTC, que es la zona de CI, el fallo no se ve. Pasada contramain, la prueba falla con"Due: Sep 8, 2026"; pasada contra esta rama, 10 de 10 en serie.mainya fusionado (PR fix(deps): actualizaciones de seguridad dentro de la misma versión mayor #94 y PR test(timer): no volcar la página entera al log #95 incluidos) ynpm cisobre el lockfile:npx vitest run366/366 ynpx playwright test253/253.Qué cambia en
lib/fechas(para quien construya encima)Las firmas no cambian; cambia el comportamiento con las cadenas
AAAA-MM-DD:deSQLite('2026-09-09')devuelve la medianoche local de ese día (antes daba medianoche UTC). Un día inexistente, como'2026-02-30', danull. Las cadenas con hora ('2026-09-09 14:00:00', conT, conZo con desfase) se leen igual que antes: sin zona, como UTC.fecha(),fechaHora()yrelativo()heredan ese cambio: una fecha solo-día se formatea como ese día en cualquier zona.vencida(valor, ahora)compara el día de calendario conhoyLocal(ahora). Para una fecha solo-día, el resultado es el mismo que antes. Para una marca de tiempo, usa ahora el día local de ese instante (antes cortaba la cadena, es decir, el día en UTC).diaDeCalendario(valor): string | null. Devuelve una fecha solo-día tal cual, o el día local de una marca de tiempo. Es el valor que espera un<input type="date">.IssueDetailsModal.astro, el repintado de la tarjeta usavencida()en lugar de su comparación propia, y el campo de fecha se rellena condiaDeCalendario().playwright.config.ts: el servidor e2e arranca conTZ=America/Bogota.Si se añade hora de entrega, ojo: un valor con hora y sin zona se sigue leyendo como UTC. Para guardar una hora local hay que guardarla con su desfase, o convertirla a UTC antes de guardarla.
Notas
🤖 Generated with Claude Code