Saltar al contenido principal

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

AtributoQué hace
valuebirth, today, now, una fecha suelta o un rango START..END
rangeUn rango START..END — una escritura más nueva de la misma idea
from / toLos dos extremos de un rango, dados por separado
ordersequential recorre el rango en vez de sortear de él — vea Un eje de fechas
stepCuánto avanza cada fila en un eje recorrido: 15m, 1h30m, 2d, 3mo, 1y
weekdaysQué días de la semana conserva un eje recorrido: mon..fri, sun,wed
cyclefalse rechaza en vez de dar la vuelta cuando un rango ACOTADO recorrido se agota
formatFormato de salida (vea Formato de la salida); por omisión L
localVeinticinco: 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 / youngestVentana de edad en años para value="birth" (por omisión 80 y 10)
precisionday, second o millisecond
ofMedir desde otra columna de fechas en vez de sortear — vea «Un intervalo» más abajo
plusCuá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"/>
./run demo.tdc (5 rows)
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"/>
./run demo.tdc (6 rows)
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.DD o YYYY/MM/DD;
  • fecha y hora: YYYY-MM-DDTHH:mm, YYYY-MM-DDTHH:mm:ss o YYYY-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"/>
./run demo.tdc (5 rows)
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"/>
./run demo.tdc (5 rows)
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"/>
./run demo.tdc — la misma semilla, con un año de diferencia
--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"/>
./run axis.tdc (count=5)
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:

EscritoSignificaGrupo
15m15 minutosfijo
1h30m90 minutosfijo
2 o 2d2 díasfijo
1w7 díasfijo
3mo3 meses de calendariocalendario
1y6mo18 meses de calendariocalendario

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"/>
./run axis.tdc (count=4)
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"/>
./run axis.tdc (count=4)
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"/>
./run axis.tdc (count=6)
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"/>
./run axis.tdc (count=6)
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 calendario1mo, 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"/>
./run axis.tdc (count=7)
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:

./run axis.tdc (rango de 2 días, count=4, cycle=false)
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"/>
./run demo.tdc (5 rows)
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"/>
./run demo.tdc
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"/>
./run demo.tdc (5 rows)
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 rangoPaso por omisiónQué cambia precision
solo fecha (YYYY-MM-DD)un díarara vez hace falta — ya son días completos
fecha y horaun milisegundoprecision="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>
./run stay.tdc (6 filas)
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 comoSignifica
7dexactamente siete días, en cada fila
3..10dde tres a diez días, sorteado por fila (ambos extremos incluidos)
1..3mode uno a tres meses, por el calendario
-10..-3dde tres a diez días antes de la fuente
45un 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>
./run ship.tdc (4 filas)
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>
./run visit.tdc (4 filas)
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>
./run orders.tdc (4 filas)
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>
./run lease.tdc (4 filas)
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:

TokenSignificaEjemplo
YYYYaño de 4 dígitos2024
YYaño de 2 dígitos24
MMMMnombre completo del mesMarch
MMMnombre corto del mesMar
MMmes de 2 dígitos03
Mmes sin cero inicial3
DDdía de 2 dígitos05
Ddía sin cero inicial5
ddddnombre completo del díaTuesday
dddnombre corto del díaTue
HHhora de 2 dígitos (24 h)09
Hhora sin cero inicial9
mmminuto de 2 dígitos04
mminuto sin cero inicial4
sssegundo de 2 dígitos07
ssegundo sin cero inicial7
SSSmilisegundos000
Zdesplazamiento UTC con dos puntos+00:00
ZZdesplazamiento UTC sin dos puntos+0000
ISOfecha en formato ISO 86012024-03-05
ISO_TIMEfecha y hora en ISO 86012024-03-05T09:04:07
Lfecha corta según el locale03/05/2024
LLfecha larga según el localeMarch 5, 2024
LLLfecha larga con la horaMarch 5, 2024 09:04
LLLLla misma, con el día de la semanaTuesday, March 5, 2024 09:04
Son tokens, y un casi-token se rechaza

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"/>
./run demo.tdc
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"/>
./run demo.tdc
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 -->
./run demo.tdc
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, range y from/to son tres escrituras de una misma ventana — use la que mejor se lea.
  • L / LL cambian con local; YYYY-MM-DD y 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 m es el minuto y mo es el mes. step="1mo15d" se rechaza — escriba 45d o 1mo.
  • weekdays filtra, step marca 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.
  • of mide desde otra columna y plus dice 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 format y cualquier local. Solo una fecha que TDC no generó — leída de un fichero — tiene que estar en forma ISO.
  • format aplica solo a fechas. Sobre identificadores de plantilla (SSN, IBAN, teléfono…) es un error — dele forma a esos con filtros de interpolación.

Vea también

  • format, range y local en la referencia de atributos.
  • Templateperson.b_day y date.range comparten este mismo formateo de fechas.