Date, Time y Datetime
Tres tipos para el tiempo, y una zona horaria que explica el 90 % de los «pero si en el informe salía otro día».
✓ En esta sub-lección
- 01Elegir entre Date, Time y Datetime según lo que realmente se necesita saber.
- 02Crear fechas y operar con ellas sin escribirlas como texto.
- 03Explicar por qué una fecha parece cambiar según quién la mira.
La nutria: ¿Te acuerdas? · Repaso de la lección 3
En rawName.trim().toLowerCase(), ¿qué método se ejecuta primero?
En el asistente de campos hay tres opciones distintas para el tiempo: Date, Time y Date/Time. Elegiste mal alguna vez y lo pagaste en un informe. Apex tiene exactamente los mismos tres tipos, con los mismos nombres y las mismas consecuencias.
EL MISMO DATO, TRES LECTURAS
- guardado—
- en Madrid16/03 00:30
- en Londres—
Paso 1 de 4
Un pedido se crea a las 00:30 del 16 de marzo, hora de Madrid. Datetime guarda un instante exacto: día y hora.
Crear una fecha
Las fechas no se escriben entre comillas. Un texto entre comillas es texto, aunque parezca una fecha, y no sabe sumar días. Para crear una fecha se usa newInstance(), indicando año, mes y día por separado; para la de hoy, today().
Date closeDate = Date.newInstance(2026, 3, 15); // año, mes, día
Date today = Date.today();
Datetime createdAt = Datetime.now();
Datetime meeting = Datetime.newInstance(2026, 3, 15, 14, 30, 0);
Time reminder = Time.newInstance(9, 0, 0, 0); // h, min, s, msHacer cuentas con fechas
Sumar un mes a una fecha no es sumar 30 días, y calcular los días entre dos fechas a mano es una invitación al bug. Los tipos de fecha traen métodos que ya saben de meses de 28 días y de años bisiestos.
| Método | Qué devuelve | Ejemplo |
|---|---|---|
| addDays(n) / addMonths(n) / addYears(n) | Date: una fecha nueva desplazada. | closeDate.addMonths(12) |
| daysBetween(otraFecha) | Integer: días de diferencia (negativo si es anterior). | today.daysBetween(closeDate) |
| monthsBetween(otraFecha) | Integer: meses completos de diferencia. | start.monthsBetween(end) |
| year() / month() / day() | Integer: la parte que pides. | closeDate.year() |
| addDays() sobre un Datetime | Datetime: mismo instante, otro día. | createdAt.addHours(2) |
| format() | String: la fecha lista para mostrar. | createdAt.format() |
Date signed = Date.newInstance(2026, 1, 31);
Date renewal = signed.addMonths(1); // 2026-02-28, no 2026-02-31
Date today = Date.today();
Integer daysToRenewal = today.daysBetween(renewal);La nutria: Date.today().daysBetween(): una cadena que empieza en el tipo
Date closeDate = Date.newInstance(2026, 12, 31);
Integer daysLeft = Date.today().daysBetween(closeDate); // cadena: hoy → días hasta el cierre
Integer closeYear = closeDate.addDays(30).year(); // cadena: +30 días → su año
String closeLabel = String.valueOf(closeDate.addMonths(1)); // anidado: la fecha nueva, como textoLa zona horaria, de una vez por todas
Un Datetime se guarda siempre en y se muestra en la zona horaria del usuario que lo mira. Por eso una reunión creada a las 00:30 en Madrid puede aparecer como el día anterior para un compañero en Londres: el instante es el mismo, la etiqueta cambia.
La nutria: El informe que «estaba mal»
Datetime createdAt = Datetime.now();
Date localDay = createdAt.date(); // día según la zona del usuario
Date gmtDay = createdAt.dateGMT(); // día en GMT
String shown = createdAt.format(); // texto, ya en la zona del usuario