Ir al contenido
angel.library

Date, Temporal, RegExp e Intl

Date representa un instante, no una zona horaria permanente. Temporal modela por separado fechas, instantes, duraciones y zonas, pero está previsto para ECMAScript 2027. RegExp describe patrones de texto y puede conservar estado con g o y. Intl presenta valores según idioma, región y zona; conserva el dato original separado de su formato.

Date guarda un número de milisegundos desde el 1 de enero de 1970 en UTC. Sus métodos pueden interpretar o mostrar el mismo instante en UTC o en la zona local. No modela por sí sola una zona horaria permanente ni una fecha de calendario sin hora.

const instant = new Date("2026-08-18T15:30:00.000Z")
instant.getTime() // 1787067000000
instant.toISOString() // '2026-08-18T15:30:00.000Z'
instant.toJSON() // '2026-08-18T15:30:00.000Z'
APIDevuelveMutaCaso de uso
new Date()Date con el instante actualno aplicaregistrar el momento actual
new Date(value)Date desde texto o milisegundosno aplicaconvertir un instante
Date.now()milisegundos actualesnomedir o guardar timestamp
Date.parse(text)milisegundos o NaNnointerpretar texto ISO
Date.UTC(...)milisegundos UTCnoconstruir sin zona local
getTime()milisegundosnocomparar o calcular duración
getFullYear(), getMonth(), getDate()componentes localesnoleer calendario local
getUTCFullYear(), getUTCMonth(), getUTCDate()componentes UTCnoleer calendario UTC
setDate(), setMonth(), etc.timestampsímodificar la instancia existente
toISOString()string ISO en UTCnotransportar un instante
const date = new Date("2026-01-31T00:00:00.000Z")
const copy = new Date(date)
copy.setUTCDate(copy.getUTCDate() + 1)
copy.toISOString() // '2026-02-01T00:00:00.000Z'
date.toISOString() // '2026-01-31T00:00:00.000Z'

Los meses numéricos empiezan en cero: enero es 0 y diciembre es 11. Para evitar interpretaciones distintas, intercambia instantes con ISO 8601 completo y zona explícita, como 2026-08-18T15:30:00Z.

function isValidDate(value) {
return value instanceof Date && !Number.isNaN(value.getTime())
}
isValidDate(new Date("2026-08-18")) // true
isValidDate(new Date("invalid")) // false

Temporal separa conceptos que Date mezcla: una fecha de calendario, una hora sin zona, un instante exacto, una duración y una fecha-hora ligada a una zona identificada por la Internet Assigned Numbers Authority (IANA). La propuesta alcanzó Stage 4, pero está prevista para ECMAScript 2027 y no forma parte de la edición 2026; revisa soporte o usa el polyfill oficial antes de adoptarla.

TipoRepresentaEjemplo de uso
Temporal.PlainDatefecha sin hora ni zonacumpleaños o fecha de entrega
Temporal.PlainTimehora sin fecha ni zonahorario habitual
Temporal.PlainDateTimefecha y hora sin zonavalor de calendario todavía no localizado
Temporal.Instantpunto exacto de la línea de tiempotimestamp de un evento
Temporal.ZonedDateTimeinstante, zona y calendarioreunión en una ciudad
Temporal.Durationcantidad de tiemposumar una semana o medir diferencia
const release = Temporal.PlainDate.from("2026-08-25")
const nextReview = release.add({ days: 7 })
release.toString() // '2026-08-25'
nextReview.toString() // '2026-09-01'
const meeting = Temporal.ZonedDateTime.from({
year: 2026,
month: 8,
day: 25,
hour: 9,
timeZone: "America/Bogota"
})
meeting.toString()
// '2026-08-25T09:00:00-05:00[America/Bogota]'

Los objetos Temporal son inmutables: add, subtract y with devuelven otro valor. Elige el tipo por el significado del dato; no añadas una zona a un cumpleaños ni elimines la zona de un evento global sin una decisión explícita.

Una expresión regular describe un patrón de texto. Es útil para búsqueda, extracción y reemplazo; una validación de negocio compleja suele necesitar además reglas normales de JavaScript.

BanderaSignificado
gtodas las coincidencias
iignora mayúsculas y minúsculas
m^ y $ trabajan por línea
s. también incluye saltos de línea
usemántica Unicode
ybúsqueda desde lastIndex de forma estricta
dañade índices de las coincidencias
vconjuntos Unicode avanzados y propiedades de strings
APIDevuelveMuta estadoCaso de uso
regexp.test(text)booleanopuede cambiar lastIndex con g o ycomprobar coincidencia
regexp.exec(text)array o nullpuede cambiar lastIndexextraer grupos e índice
text.match(regexp)array o nullno cambia el stringextraer una o varias coincidencias
text.matchAll(regexp)iteradorno cambia el stringrecorrer grupos de todas las coincidencias
text.search(regexp)índice o -1nolocalizar la primera coincidencia
text.replace(regexp, value)string nuevonotransformar texto
text.split(regexp)arraynodividir con un patrón
const pattern = /(?<code>[A-Z]{2})-(?<number>\d{3})/
const result = pattern.exec("Pedido CO-418 listo")
result?.[0] // 'CO-418'
result?.index // 7
result?.groups?.code // 'CO'
result?.groups?.number // '418'
pattern.test("Sin código") // false
const text = "IDs: AB-100, CO-418 y MX-007"
const matches = [...text.matchAll(/(?<code>[A-Z]{2})-(?<id>\d{3})/g)].map(
(match) => match.groups
)
matches
// [
// { code: 'AB', id: '100' },
// { code: 'CO', id: '418' },
// { code: 'MX', id: '007' }
// ]

Evita expresiones con retroceso catastrófico sobre texto no confiable. Limita el tamaño de entrada, simplifica cuantificadores ambiguos y prueba casos adversos cuando una regex se ejecute en servidor.

Texto recibido no debe interpolarse como regex sin escapar: símbolos como ., *, [ o ( cambiarían el patrón. RegExp.escape devuelve texto seguro para tratarlo de forma literal.

const query = "docs.v2"
const pattern = new RegExp(`^${RegExp.escape(query)}$`, "i")
pattern.test("docs.v2") // true
pattern.test("docs-v2") // false

No reimplementes el escape añadiendo \\ a unos pocos símbolos: existen casos de contexto, guiones, escapes y Unicode fáciles de omitir. RegExp.escape forma parte de ECMAScript 2025; comprueba compatibilidad o usa una solución mantenida cuando el runtime todavía no lo incluya.

La bandera v amplía patrones Unicode y permite operaciones de conjuntos. Los modificadores inline aplican i, m o s solo a una parte del patrón.

const greekLetter = /[\p{Script=Greek}&&\p{Letter}]/v
greekLetter.test("Ω") // true
greekLetter.test("A") // false
const command = /^(?i:help|ayuda): (.+)$/
command.test("AYUDA: arrays") // true

Estas capacidades son recientes. Un patrón con v o modificadores inline produce SyntaxError al parsear en un runtime incompatible; revisa el objetivo antes de enviarlo al cliente.

Intl usa datos de localización del runtime. Separa el valor de su presentación: conserva números y fechas como datos, y formatea al final para la interfaz.

ConstructorResuelve
Intl.NumberFormatnúmeros, moneda, porcentajes y unidades
Intl.DateTimeFormatfecha y hora con zona explícita
Intl.RelativeTimeFormat“hace 2 días” o “dentro de 1 hora”
Intl.ListFormatlistas con conjunciones del idioma
Intl.Collatorcomparación y orden de texto
Intl.PluralRulescategoría plural del idioma
Intl.Segmenterpalabras, frases o grafemas
const currency = new Intl.NumberFormat("es-CO", {
style: "currency",
currency: "COP",
maximumFractionDigits: 0
})
currency.format(125000) // resultado localizado, por ejemplo: '$ 125.000'
new Intl.NumberFormat("es", {
style: "unit",
unit: "kilometer-per-hour"
}).format(80)
// resultado localizado, por ejemplo: '80 km/h'
const instant = new Date("2026-08-18T15:30:00Z")
const formatter = new Intl.DateTimeFormat("es-CO", {
dateStyle: "long",
timeStyle: "short",
timeZone: "America/Bogota"
})
formatter.format(instant)
// resultado localizado, por ejemplo: '18 de agosto de 2026, 10:30 a. m.'

Especificar timeZone evita que el servidor y el navegador muestren zonas diferentes por accidente.

const list = new Intl.ListFormat("es", {
style: "long",
type: "conjunction"
})
list.format(["HTML", "CSS", "JavaScript"])
// 'HTML, CSS y JavaScript'
const relative = new Intl.RelativeTimeFormat("es", { numeric: "auto" })
relative.format(-1, "day") // 'ayer'
relative.format(2, "day") // 'dentro de 2 días'
const collator = new Intl.Collator("es", { sensitivity: "base" })[
("zorro", "Árbol", "avión")
].toSorted(collator.compare)
// ['Árbol', 'avión', 'zorro']

La puntuación y los espacios exactos pueden variar entre versiones de los datos de localización. Prueba el significado, no una representación demasiado rígida, salvo que tu producto exija un formato contractual.

function formatPublication(iso, locale = "es-CO") {
const date = new Date(iso)
if (Number.isNaN(date.getTime())) {
return "Fecha desconocida"
}
return new Intl.DateTimeFormat(locale, {
year: "numeric",
month: "short",
day: "2-digit",
timeZone: "UTC"
}).format(date)
}
formatPublication("2026-08-18T15:30:00Z")
// resultado localizado, por ejemplo: '18 ago 2026'
formatPublication("sin-fecha")
// 'Fecha desconocida'