El generador date
Se usa cuando se necesita una fecha o una fecha con hora — un cumpleaños, la fecha de un documento, la marca de tiempo de un evento — dentro de un rango y escrita en un formato específico.
Las fechas corren sobre el runtime de fechas portable propio de TDC: un parser estricto, un calendario UTC y un formateador localizado, sin depender de moment.js. La misma configuración está diseñada para producir las mismas fechas en todas las implementaciones.
Las salidas de ejemplo de abajo son ilustrativas — los valores exactos dependen de la semilla y pueden cambiar según la versión del core. Lo que se mantiene fijo es la forma y el formato.
De un vistazo
| Atributo | Qué hace |
|---|---|
value | birth, today, now, una fecha suelta o un rango START..END |
range | Un rango START..END — una escritura más nueva de la misma idea |
from / to | Los dos extremos de un rango, dados por separado |
order | sequential recorre el rango en vez de sortear de él — vea Un eje de fechas |
step | Cuánto avanza cada fila en un eje recorrido: 15m, 1h30m, 2d, 3mo, 1y |
weekdays | Qué días de la semana conserva un eje recorrido: mon..fri, sun,wed |
cycle | false rechaza en vez de dar la vuelta cuando un rango ACOTADO recorrido se agota |
format | Formato de salida (vea Formato de la salida); por omisión L |
local | Veinticinco: ar, cs, de, el, en, es, fi, fr, hi, hu, id, it, ja, ko, nl, pl, pt, ru, sv, th, tr, uk, vi, zh-cn, zh-tw. Diecinueve responden también a un alias de tres letras — ara, ces, deu, ell, eng, spa, fin, fra, hun, ind, ita, jpn, kor, nld, pol, por, tur, ukr, vie —, y hi, ru, sv, th, zh-cn, zh-tw no tienen ninguno (el zh a secas se acepta y lee la tabla tradicional). Se hereda de <env> si se omite |
oldest / youngest | Ventana de edad en años para value="birth" (por omisión 80 y 10) |
precision | day, second o millisecond |
of | Medir desde otra columna de fechas en vez de sortear — vea «Un intervalo» más abajo |
plus | Cuánto desde ella: 7d, 3..10d, 1..3mo, -10..-3d |
Solo uno de value, range o el par from/to se usa para describir un rango — son
tres escrituras de lo mismo. No dé ninguno y el rango va de 1970-01-01 al momento
actual; vea Sin límites.
Los últimos cuatro atributos pertenecen a un rango recorrido y solo se leen junto con
order="sequential". En una fecha sorteada, step o weekdays quedarían ignorados en
silencio, así que se rechazan (TDC248).
Una fecha aleatoria dentro de un rango
Dele a value un rango en la forma START..END (ambos extremos incluidos) y
obtendrá una fecha aleatoria sorteada de manera uniforme dentro de él.
<gen type="date" value="2020-01-01..2025-12-31" format="YYYY-MM-DD"/>
2024-08-15 2022-02-04 2020-06-21 2025-10-04 2021-03-31
Los extremos forman parte de la ventana. Un rango de una semana lo deja ver fácilmente —
con suficientes filas, aparecen tanto 2024-06-01 como 2024-06-07:
<gen type="date" value="2024-06-01..2024-06-07" format="YYYY-MM-DD"/>
2024-06-06 2024-06-03 2024-06-01 2024-06-07 2024-06-02 2024-06-02
Las fechas de entrada se parsean de forma estricta, en alguna de estas formas:
- fecha:
YYYY-MM-DD,YYYY.MM.DDoYYYY/MM/DD; - fecha y hora:
YYYY-MM-DDTHH:mm,YYYY-MM-DDTHH:mm:ssoYYYY-MM-DDTHH:mm:ss.SSS; - rango:
START..END.
El texto libre (June 6th, 06/06/24) no se acepta — use una de las formas
estrictas de arriba.
El atributo range — la misma ventana, una escritura más nueva
range="START..END" significa exactamente lo mismo que value="START..END". Se lee
mejor cuando value quedaría con aspecto de palabra clave, y es la escritura que
comparte con la plantilla date.range.
<gen type="date" range="2020-01-01..2024-12-31" format="YYYY-MM-DD"/>
2023-11-08 2021-09-30 2020-05-23 2024-10-19 2021-01-14
El atributo format solo controla cómo se escribe la
fecha — nunca cambia la ventana, y la ventana nunca depende del formato.
from y to — los extremos dados por separado
Cuando resulta más claro nombrar cada extremo por su cuenta, use from y to. Es la
escritura más natural para ventanas de fecha y hora, donde el rango quedaría como una
cadena única muy larga.
<gen type="date"
from="2026-05-02T09:00:00"
to="2026-05-02T09:00:05"
format="YYYY-MM-DDTHH:mm:ss"/>
2026-05-02T09:00:04 2026-05-02T09:00:01 2026-05-02T09:00:03 2026-05-02T09:00:00 2026-05-02T09:00:02
Sin límites — el reloj cierra el rango
Un generador date al que no se le dio ningún extremo produce una fecha igual. La
ventana va de 1970-01-01 al momento actual, así que el generador lee el reloj aunque
nada en la configuración mencione una fecha:
<gen type="date" format="YYYY-MM-DD"/>
--now 2026-04-23 --now 2027-04-23 1972-06-01 1972-06-17 1994-11-20 1995-04-30 1972-05-06 1972-05-21
Esta es la forma más fácil de perder la reproducibilidad sin darse cuenta. Dele al
generador dos extremos, o fije el reloj con
--now.
Un extremo no es una tercera opción para un rango del que se SORTEA: from sin to es
TDC150, y range="2020-01-01.." es TDC151. Donde un valor se sortea, un solo extremo no
dice nada sobre qué sortear. Un extremo SÍ alcanza cuando el rango se
recorre — de eso trata la
sección siguiente.
Un eje de fechas: recorrer el rango en vez de sortear de él
Todo lo anterior sortea: cada fila toma una fecha al azar de la ventana. Pida una fila por día durante un año y obtendrá repeticiones y huecos, porque eso es lo que significa sortear.
Agregue order="sequential" y el rango se recorre. La fila 0 es el comienzo, la fila 1
está un paso más adelante, y la fila i es comienzo + i × paso. Este es el eje de tiempo
que una ejecución necesita cuando los datos son una serie y no una muestra: lecturas,
transacciones, una bitácora.
from solo — un eje sin final
Un eje recorrido toma solo un comienzo. Su última fila es comienzo + (count − 1) × paso
—la fila 0 es el comienzo mismo—, o sea una consecuencia del largo de la ejecución y no
algo que usted calcule y escriba:
<gen type="date" from="2026-01-01" order="sequential" format="YYYY-MM-DD"/>
2026-01-01 2026-01-02 2026-01-03 2026-01-04 2026-01-05
Suba count a un millón y el eje recorre un millón de días. Nada se expande en una lista,
así que el rango no cuesta memoria por largo que sea.
step — cuánto avanza cada fila
Por omisión, un día. step toma un número y una unidad, y las unidades se suman:
| Escrito | Significa | Grupo |
|---|---|---|
15m | 15 minutos | fijo |
1h30m | 90 minutos | fijo |
2 o 2d | 2 días | fijo |
1w | 7 días | fijo |
3mo | 3 meses de calendario | calendario |
1y6mo | 18 meses de calendario | calendario |
m es el minuto, como en toda notación de esta forma. El mes es mo, porque m ya
está tomado; y no M, porque una diferencia de cuarenta y cuatro mil entre tres minutos y
tres meses no debería depender de la caja de una letra.
<gen type="date" from="2026-01-01T09:00:00" order="sequential"
step="15m" format="YYYY-MM-DD HH:mm"/>
2026-01-01 09:00 2026-01-01 09:15 2026-01-01 09:30 2026-01-01 09:45
Un paso es O fijo O de calendario, nunca ambos. 15m son siempre 900 000 milisegundos; un
mes son de 28 a 31 días. Se suman solo dentro de su propio grupo, y step="1mo15d" se
rechaza (TDC247): «un mes y quince días» son 43, 44, 45 o 46 días según cuál mitad se
aplique primero, y una configuración cuyo significado depende de un orden invisible es peor
que una que no se analiza. Escriba 45d, o 1mo.
Un paso de calendario conserva el día del mes
Cada paso se mide desde el comienzo, nunca se acumula. Esa distinción es invisible en días y decide la respuesta en meses:
<gen type="date" from="2026-01-31" order="sequential" step="1mo" format="YYYY-MM-DD"/>
2026-01-31 2026-02-28 2026-03-31 2026-04-30
Febrero se recorta al 28 y marzo vuelve al 31. Avanzar desde el febrero recortado habría dado el 28 de marzo y habría arrastrado con él a todos los meses siguientes.
weekdays — conservar solo algunos días
Un filtro, no un paso:
<gen type="date" from="2026-01-01" order="sequential"
weekdays="mon..fri" format="ddd YYYY-MM-DD"/>
Thu 2026-01-01 Fri 2026-01-02 Mon 2026-01-05 Tue 2026-01-06 Wed 2026-01-07 Thu 2026-01-08
Del viernes al lunes hay un salto de tres días, y por eso justamente esto no es un paso: un paso mantiene pareja la separación y un filtro la rompe. Mantenerlos aparte es lo que permite combinarlos — «cada 12 horas, solo en días hábiles» necesita las dos palabras:
<gen type="date" from="2026-01-02T00:00:00" order="sequential"
step="12h" weekdays="mon..fri" format="ddd YYYY-MM-DD HH:mm"/>
Fri 2026-01-02 00:00 Fri 2026-01-02 12:00 Mon 2026-01-05 00:00 Mon 2026-01-05 12:00 Tue 2026-01-06 00:00 Tue 2026-01-06 12:00
Los rangos usan .., como todo rango en TDC, y una lista usa comas: weekdays="sun,wed".
Un rango da la vuelta, así que fri..mon es viernes, sábado, domingo, lunes — una
semana es un círculo, y prohibir recorrerlo dejaría la mitad de los rangos sin poder
escribirse.
Dos clases de paso rechazan weekdays (TDC250), por dos razones distintas.
Un número entero de semanas cae siempre en el mismo día de la semana, así que el
filtro coincidiría con todas las filas o con ninguna — una columna llena o una vacía, sin
decir nada al respecto. Eso se mide sobre el largo del paso, así que 14d se rechaza
igual que 2w, mientras que 10d pasa.
Un paso de calendario — 1mo, 3mo, 1y — se rechaza por la razón opuesta: no
fija el día de la semana. El día 15 recorre jueves, domingo, domingo, miércoles, viernes
y lunes a lo largo de la primera mitad de 2026. Qué filas sobrevivirían al filtro lo
decidiría el calendario y no lo que dice la configuración, así que el paso y el filtro
piden elegir uno de los dos.
Si lo que querías era una fecha mensual desplazada al siguiente día hábil — como un
sistema de facturación mueve una factura que cae en domingo —, hoy eso no se puede
expresar, y el filtro no lo haría: descartaría febrero entero en lugar de moverlo. Un
calendario de días hábiles es otra cosa y sí funciona: step="1d" junto con
weekdays="mon..fri", como arriba.
Un rango acotado da la vuelta
Déle los dos extremos a un rango recorrido y volverá al principio cuando se acabe, como hace una lista corta:
<gen type="date" range="2026-01-01..2026-01-03" order="sequential" format="YYYY-MM-DD"/>
2026-01-01 2026-01-02 2026-01-03 2026-01-01 2026-01-02 2026-01-03 2026-01-01
cycle="false" convierte el agotarse en un rechazo:
tdcv2: order="sequential" cycle="false": the source has only 2 values, so row 3 has none — shorten count= or lengthen the source
Un eje abierto no tiene final donde dar la vuelta, así que allí cycle no significa
nada.
Un cumpleaños con value="birth"
value="birth" produce una fecha de nacimiento relativa a la fecha actual, acotada por
una ventana de edad. youngest y oldest son edades en años (por omisión 10 y
80), así que youngest="18" oldest="65" da adultos en edad laboral.
<gen type="date" value="birth" youngest="18" oldest="65" format="MM/DD/YYYY"/>
07/05/1997 11/23/1985 02/14/2003 09/30/1971 06/18/1990
Por qué usarlo en vez de un rango fijo: la ventana sigue al momento actual, así que
la misma configuración seguirá produciendo edades plausibles el año que viene sin tocar
las fechas. Para un cumpleaños atado a una persona sintética completa, la plantilla
person.b_day acepta los mismos atributos
oldest/youngest/format.
Por eso mismo las fechas se mueven. La ventana avanza con el reloj, así que mañana la
misma semilla da otra fecha de nacimiento: la edad se sostiene, la fecha no. Donde la
salida tenga que quedarse quieta — una prueba de snapshot, una fixture, un reporte de
bug — fije el reloj con --now.
today y now
value="today" es la fecha actual; value="now" es la fecha y la hora actuales.
Ambos leen el reloj del runtime, así que son las marcas naturales para campos del tipo
«generado el» o «vigente al».
<gen type="date" value="today" format="LL"/>
<gen type="date" value="now" format="YYYY-MM-DDTHH:mm:ss.SSS"/>
value="today" format="LL" April 23, 2026 value="now" format="YYYY-MM-DDTHH:mm:ss.SSS" 2026-04-23T12:00:00.000
Leer el reloj es justamente el punto de ambos, y es lo que los vuelve no reproducibles:
la semilla no decide qué día es hoy. Fije el reloj con
--now y today y now devuelven el
instante que usted nombró, en cada corrida.
precision — el paso para rangos de fecha y hora
precision fija el paso más pequeño con el que se mueve un rango: day, second o
millisecond. Para una ventana de cinco segundos avanzando de segundo en segundo:
<gen type="date"
from="2026-05-02T09:00:00"
to="2026-05-02T09:00:05"
precision="second"
format="YYYY-MM-DDTHH:mm:ss"/>
2026-05-02T09:00:04 2026-05-02T09:00:01 2026-05-02T09:00:03 2026-05-02T09:00:00 2026-05-02T09:00:02
Cuando se omite precision, el valor por omisión sigue al tipo de rango:
| Tipo de rango | Paso por omisión | Qué cambia precision |
|---|---|---|
solo fecha (YYYY-MM-DD) | un día | rara vez hace falta — ya son días completos |
| fecha y hora | un milisegundo | precision="second" pone los milisegundos en cero |
Use precision="second" cuando quiera marcas de tiempo limpias y de aspecto humano en
lugar de ruido de milisegundos; use precision="millisecond" (el valor por omisión para
fecha y hora) cuando necesite resolución por debajo del segundo.
Un intervalo: una fecha medida desde otra fecha
Los registros reales están llenos de parejas: ingreso y alta, pedido y envío, emisión y caducidad, el principio y el final de un turno. La segunda fecha no es independiente de la primera — es la primera más una duración — y dos rangos separados no pueden decirlo. Ponen el alta antes del ingreso en buena parte de las filas.
of nombra la columna desde la que medir y plus dice cuánto:
<sequence name="Admitted">
<gen type="date" from="2026-01-01" to="2026-03-01" format="YYYY-MM-DD"/>
</sequence>
<sequence name="Discharged">
<gen type="date" of="Admitted" plus="2..14d" format="YYYY-MM-DD"/>
</sequence>
2026-02-06 2026-02-16 2026-02-14 2026-02-23 2026-01-11 2026-01-16 2026-01-11 2026-01-24 2026-02-27 2026-03-06 2026-01-08 2026-01-14
Cada alta es posterior a su propio ingreso, entre 2 y 14 días — y la duración de cada estancia se sortea por fila, que es justo lo que dos rangos independientes tiran a la basura.
plus — la distancia
| Escrito como | Significa |
|---|---|
7d | exactamente siete días, en cada fila |
3..10d | de tres a diez días, sorteado por fila (ambos extremos incluidos) |
1..3mo | de uno a tres meses, por el calendario |
-10..-3d | de tres a diez días antes de la fuente |
45 | un número a secas significa días |
Las unidades son las que step ya usa:
s, m, h, d, w, mo, y — y como allí, m es el minuto y mo el mes.
Un solo valor es la misma distancia en cada fila:
<sequence name="Shipped">
<gen type="date" of="Ordered" plus="1d" format="YYYY-MM-DD"/>
</sequence>
2026-05-23 2026-05-24 2026-05-06 2026-05-07 2026-05-13 2026-05-14 2026-05-21 2026-05-22
Escriba primero el límite menor, como en cualquier otro rango. Para contar hacia
atrás, ponga ambos límites en negativo: plus="-10..-3d" son de tres a diez
días antes. plus="10..3d" es una errata y se rechaza (TDC264) en vez de
darse la vuelta en silencio.
Meses y años avanzan por el calendario y no por un número fijo de días, así que
2026-01-31 más un mes es 2026-02-28 — el mismo ajuste que hace
step.
El desplazamiento lee el valor, no el texto impreso
Una columna de fechas imprime una representación de su fecha. 03/02/2026 es
el 3 de febrero con local="en" y el 2 de marzo con local="ru", y
format="MMMM D" tira el año por completo. Por eso el desplazamiento no lee la
celda en absoluto: la columna desde la que mide guarda la fecha que generó, y la
aritmética corre sobre ella. Vale cualquier format y cualquier locale.
<env count="4" seed="visit" local="ru">
<sequence name="Visit"><gen type="date" from="2026-03-01" to="2026-03-31"/></sequence>
<sequence name="Followup"><gen type="date" of="Visit" plus="2w"/></sequence>
</env>
20.03.2026 03.04.2026 22.03.2026 05.04.2026 27.03.2026 10.04.2026 09.03.2026 23.03.2026
El único caso en que no hay nada que leer es una fecha que TDC no generó — una
columna cargada con file, por ejemplo. Allí solo existe el texto,
así que debe estar en forma ISO (YYYY-MM-DD), que significa lo mismo en
cualquier locale. Lo demás se rechaza en vez de adivinarse.
La fuente puede estar recorrida, sorteada o ser otro desplazamiento
of= lee lo que sea que produjo la columna nombrada. Una fuente recorrida es la pareja
que los registros reales piden más a menudo: los pedidos avanzan por el calendario día a día,
y la entrega es unos días después de su propio pedido:
<sequence name="Ordered">
<gen type="date" from="2026-01-01" order="sequential" step="1d" format="YYYY-MM-DD"/>
</sequence>
<sequence name="Delivered">
<gen type="date" of="Ordered" plus="2..9d" format="YYYY-MM-DD"/>
</sequence>
2026-01-01 2026-01-06 2026-01-02 2026-01-06 2026-01-03 2026-01-12 2026-01-04 2026-01-11
La única fuente desde la que no hay una fecha que medir es una repetida: una celda
construida con repeat= contiene varias fechas unidas por un separador. Eso se rechaza por
su nombre en lugar de responderse con una columna vacía.
Encadenar, y celdas vacías
Un desplazamiento es en sí mismo una fecha que produjo este motor, así que una tercera columna puede medir desde él: firmado, caduca un año después, avisar un mes antes de eso.
<sequence name="Signed"><gen type="date" from="2026-01-15" to="2026-02-15" format="D MMMM YYYY"/></sequence>
<sequence name="Expires"><gen type="date" of="Signed" plus="1y" format="D MMMM YYYY"/></sequence>
<sequence name="Remind"><gen type="date" of="Expires" plus="-30d" format="D MMMM YYYY"/></sequence>
5 February 2026 | 5 February 2027 | 6 January 2027 31 January 2026 | 31 January 2027 | 1 January 2027 13 February 2026 | 13 February 2027 | 14 January 2027 20 January 2026 | 20 January 2027 | 21 December 2026
Una fila cuya fuente no tiene fecha — una que un filtro parent dejó fuera, o
una que missing vació — tampoco recibe fecha. No
hay desde dónde medir, e inventarla pondría un valor de aspecto convincente en
una celda que la configuración dijo que debía estar vacía.
Qué descarta of
of sitúa la fecha respecto a otra columna, así que los atributos que acotan su
sorteo propio ya no dicen nada: value, from, to, range, oldest,
youngest, order y step. Escribir alguno junto a of se rechaza (TDC264)
en vez de ignorarse — una configuración que pide fechas de junio y obtiene fechas
de enero tiene razón sobre lo que pidió y no sobre lo que obtuvo.
La columna nombrada en of debe estar declarada encima del desplazamiento
(TDC240), la misma regla que siguen running y
stat.
La capa de formato también queda descartada, por la misma razón que en un total
acumulado: un desplazamiento se construye en orden de declaración, antes de que esa capa
se ejecute. mask, case, missing, missing_as, repeat, anomaly,
anomaly_factor y percent se rechazan (TDC015) en vez de ignorarse. Aplíquelos donde
el valor se imprime — ${{Later|mask:x}}, ${{Later|upper}} — que es donde
funcionan hoy.
Un type="date" normal sin of lee cada uno de ellos con normalidad; es el
desplazamiento el que no puede.
Un desplazamiento lee una columna hermana mientras se construye la fila, algo que
la vía de streaming aún no sabe hacer, así que una configuración que lo use se
construye en memoria. TDC la encamina allí por su
cuenta; solo se nota si se fuerza el motor de flujo con --engine 2, que lo rechaza por
nombre en vez de aproximarlo.
Formato de la salida
format es una plantilla de marcadores. Cambia únicamente cómo se escribe una
fecha — el valor de fondo queda intacto. El valor por omisión es L (una fecha corta
dependiente del locale).
Todos los tokens sobre un mismo instante fijo — martes 5 de marzo de 2024, 09:04:07. El día y el mes son de una cifra a propósito, para que las parejas «con cero / sin cero» se distingan a simple vista:
| Token | Significa | Ejemplo |
|---|---|---|
YYYY | año de 4 dígitos | 2024 |
YY | año de 2 dígitos | 24 |
MMMM | nombre completo del mes | March |
MMM | nombre corto del mes | Mar |
MM | mes de 2 dígitos | 03 |
M | mes sin cero inicial | 3 |
DD | día de 2 dígitos | 05 |
D | día sin cero inicial | 5 |
dddd | nombre completo del día | Tuesday |
ddd | nombre corto del día | Tue |
HH | hora de 2 dígitos (24 h) | 09 |
H | hora sin cero inicial | 9 |
mm | minuto de 2 dígitos | 04 |
m | minuto sin cero inicial | 4 |
ss | segundo de 2 dígitos | 07 |
s | segundo sin cero inicial | 7 |
SSS | milisegundos | 000 |
Z | desplazamiento UTC con dos puntos | +00:00 |
ZZ | desplazamiento UTC sin dos puntos | +0000 |
ISO | fecha en formato ISO 8601 | 2024-03-05 |
ISO_TIME | fecha y hora en ISO 8601 | 2024-03-05T09:04:07 |
L | fecha corta según el locale | 03/05/2024 |
LL | fecha larga según el locale | March 5, 2024 |
LLL | fecha larga con la hora | March 5, 2024 09:04 |
LLLL | la misma, con el día de la semana | Tuesday, March 5, 2024 09:04 |
Cada nombre de la tabla se combina con los demás. LL [at] HH:mm da
March 5, 2024 at 00:00; las formas con nombre no son palabras clave que solo funcionen
solas.
Una letra que parece un token sin serlo es un error, no texto. hh:mm A es el reloj
de 12 horas y la marca AM/PM de Moment, que TDC no tiene; antes se imprimían a sí mismos
— hh:00 A — y la ejecución no decía nada. Ahora no pasa check y dice qué hacer:
error[TDC152]: date format: "hh" is not a token — write it as [hh] if it is meant to be literal text
Las palabras corrientes no se ven afectadas, porque sus letras no son letras de token:
DD of MM sigue dando 05 of 03. Ponga entre corchetes lo que quiera conservar literal,
que es la regla de abajo de todos modos.
Los nombres de mes y de día, y las cuatro formas de L, siguen el locale — ver
abajo. Todo lo demás es igual en cualquier idioma.
La misma fecha bajo cuatro formatos — misma semilla, así que la fecha es idéntica en cada línea y solo cambia la escritura:
<gen type="date" value="2020-01-01..2024-12-31" format="YYYY-MM-DD"/>
<gen type="date" value="2020-01-01..2024-12-31" format="DD.MM.YYYY"/>
<gen type="date" value="2020-01-01..2024-12-31" format="DD MMM YYYY"/>
<gen type="date" value="2020-01-01..2024-12-31" format="LL"/>
YYYY-MM-DD DD.MM.YYYY DD MMM YYYY LL 2023-11-08 08.11.2023 08 Nov 2023 November 8, 2023 2021-09-30 30.09.2021 30 Sep 2021 September 30, 2021 2020-05-23 23.05.2020 23 May 2020 May 23, 2020
Texto literal entre corchetes
Todo lo que va entre corchetes se copia tal cual, así que se puede envolver una fecha en texto fijo:
<gen type="date" value="2024-03-15..2024-03-15" format="[date:] YYYY-MM-DD"/>
date: 2024-03-15
Formatos dependientes del locale: L y LL
L, LL, LLL y LLLL siguen al locale, tomado del atributo local (o de
local en <env>), igual que los tokens de nombre MMMM,
MMM, dddd y ddd. El locale por omisión es en. Las plantillas
numéricas como YYYY-MM-DD y DD.MM.YYYY nunca dependen del locale — solo de la
plantilla que se escribe.
De dónde salen las palabras: veinticuatro locales vienen integrados en el motor, y
cualquier otro cuyo pack de datos incluya un DATE_LOCALE.json — setenta lo hacen —
traduce sus fechas en cuanto el pack es visible. El georgiano, el letón, el kazajo y
los suyos imprimen ahora sus propios meses y días de la semana, incluida la forma del
mes dentro de una fecha (15 იანვარს); antes caían al inglés sin decir palabra. Un
archivo trae L y LL; LLL y LLLL se toman de él cuando los escribe y se derivan
si no — LL más la hora, el día de la semana delante. Un locale sin palabras de fecha
sigue imprimiendo inglés, y el validador lo dice en voz alta en lugar de dejarlo pasar
en silencio.
Aquí está la fecha fija 2024-03-15 con format="LL", primero en el locale inglés por
omisión y luego la misma fecha renderizada de nuevo con local="ru" para mostrar el
nombre del mes localizado y la forma larga — una demostración deliberada de
localización:
<gen type="date" value="2024-03-15..2024-03-15" format="LL"/> <!-- en por omisión -->
<gen type="date" value="2024-03-15..2024-03-15" format="LL" local="ru"/> <!-- ruso -->
default (en) March 15, 2024 local="ru" 15 марта 2024 г.
L se desplaza igual: 03/15/2024 en en, 15.03.2024 en ru.
Trampas comunes, todas en un lugar
- Las fechas de entrada se parsean de forma estricta — use
YYYY-MM-DD(o.//), no texto libre. - Ambos extremos del rango están incluidos.
value,rangeyfrom/toson tres escrituras de una misma ventana — use la que mejor se lea.L/LLcambian conlocal;YYYY-MM-DDy compañía no.- Los rangos de solo fecha avanzan por día; los de fecha y hora por milisegundo, salvo que se fije
precision. order="sequential"RECORRE el rango; sin él cada fila es un sorteo independiente.- En un eje recorrido
mes el minuto ymoes el mes.step="1mo15d"se rechaza — escriba45do1mo. weekdaysfiltra,stepmarca el ritmo. Se combinan, y ninguno reemplaza al otro.today,now,value="birth"y un generador sin límites leen el reloj, así que la semilla sola no los reproduce — fije el reloj con--now.ofmide desde otra columna yplusdice cuánto. La columna nombrada debe estar declarada encima, y los atributos que acotan el sorteo propio del generador (from,to,value,range,order,step,oldest,youngest) se rechazan a su lado.- Un desplazamiento trabaja sobre la fecha que generó la columna fuente, no sobre el texto que
imprimió, así que vale cualquier
formaty cualquierlocal. Solo una fecha que TDC no generó — leída de un fichero — tiene que estar en forma ISO. formataplica solo a fechas. Sobre identificadores de plantilla (SSN, IBAN, teléfono…) es un error — dele forma a esos con filtros de interpolación.