Representa un día completo incluyendo su inicio y excluyendo el inicio del día siguiente. Para marcar una publicación en Calendario de Mac, crea un evento de todo el día; en los datos de iCalendar, una fecha de finalización explícita identifica el primer día que queda fuera del evento.
Esta guía usa una fecha de publicación ficticia: el 18 de junio de 2027. La tarea consiste en añadir un día completo de publicación al calendario de tu Mac, exportarlo y comprobar sus límites. El mismo razonamiento te ayuda a reconocer errores cuando una fecha pasa de un calendario a una hoja de cálculo y luego a una automatización.
¿Qué significa un límite exclusivo al día siguiente?
Para el día de publicación ficticio, la fecha incluida es el 18 de junio. El 19 de junio es la primera fecha excluida. En forma de intervalo semiabierto, el rango es [2027-06-18, 2027-06-19): el corchete incluye el inicio y el paréntesis excluye el final.
El estándar iCalendar hace que DTSTART de un evento sea inclusivo y que DTEND no sea inclusivo. Un evento de todo el día usa valores de fecha para ambos. Por lo tanto, una fecha de finalización al día siguiente describe un día completo. Los valores que solo contienen fecha no deben llevar un parámetro TZID. RFC 5545, componentes de eventos e identificadores de zona horaria.
Este fragmento ilustrativo muestra solo las dos propiedades que definen los límites; no es un archivo de calendario completo que se pueda importar:
DTSTART;VALUE=DATE:20270618
DTEND;VALUE=DATE:20270619
La siguiente tabla de decisión aplica esa regla a calendarios de publicación ficticios. Interpreta la última columna como la primera fecha excluida, no como otro día de publicación.
| Cobertura prevista | Fecha de inicio incluida | Fecha de finalización exclusiva |
|---|---|---|
| Solo el 18 de junio | 18 de junio de 2027 | 19 de junio de 2027 |
| Del 18 al 20 de junio, ambos inclusive | 18 de junio de 2027 | 21 de junio de 2027 |
| Solo el 30 de junio | 30 de junio de 2027 | 1 de julio de 2027 |
Crea el día de publicación en Calendario de Mac
Empieza con un calendario en el que puedas crear eventos. Para esta tarea necesitas los controles de eventos de todo el día de Calendario; no hacen falta herramientas de programación.
- Abre Calendario y ve al 18 de junio de 2027.
- Selecciona
DíaoSemanaen la parte superior de la ventana. - Haz doble clic en el área
all-daysituada encima de la cuadrícula horaria del 18 de junio. - Pon al evento el título neutro
Día de publicación de muestra. - Comprueba que el marcador ocupe solo el 18 de junio.
Apple documenta que se puede crear un evento de todo el día haciendo doble clic en el área correspondiente en la vista Día o Semana. También documenta por separado que se pueden arrastrar fechas para crear un evento de varios días. Para este ejemplo, usa la acción de un solo día. Configurar eventos de todo el día, de varios días o repetidos en Calendario en Mac.
Usa el calendario visible como primera comprobación: el marcador debe cubrir la fecha prevista, sin prolongarse hasta el 19 de junio. El límite exclusivo describe cómo se representa el rango en los datos. No indica que debas extender el marcador visible a otro día.
Exporta el evento y revisa los límites de fecha
Selecciona el calendario del evento en la lista de calendarios y, luego, elige Archivo > Exportar > Exportar. Guarda el archivo .ics resultante en un lugar práctico. Esta operación exporta los eventos del calendario seleccionado, así que si el calendario contiene varios eventos, el archivo incluirá varios registros de eventos. Apple documenta .ics como el formato de esta exportación. Importar o exportar calendarios en Mac.
En Finder, selecciona el archivo exportado y usa Archivo > Abrir con para abrirlo en un editor de texto, como TextEdit. Apple documenta este procedimiento como una forma de elegir una aplicación para abrir un archivo. Elegir una app para abrir un archivo en Mac.
Busca Día de publicación de muestra y revisa el registro del evento que lo rodea. Compara sus propiedades de inicio y finalización con el fragmento ilustrativo anterior. Es normal que haya otras propiedades; céntrate en los valores y los tipos de fecha.
Si un evento de todo el día no tiene ni DTEND ni DURATION, el estándar le asigna una duración de un día. Por lo tanto, que no haya una fecha de finalización explícita no indica automáticamente un problema. RFC 5545, componentes de eventos.
Usa la exportación como copia de diagnóstico. Si el evento visible cubre fechas incorrectas, corrígelo en Calendario y vuelve a exportarlo. Así, la comprobación corresponde al evento que creaste.
Distingue las fechas civiles, los instantes, los desfases y las zonas con nombre
Antes de trasladar el día de publicación a otra herramienta, identifica qué tipo de valor espera esa herramienta. La etiqueta de un calendario y una marca de tiempo responden a preguntas distintas.
| Concepto | Valor ilustrativo | Qué identifica |
|---|---|---|
| Fecha civil | 2027-06-18 |
Un día del calendario sin hora |
| Instante | 2027-06-18T10:00:00Z |
Un punto concreto en la línea de tiempo |
| Desfase numérico respecto de UTC | +02:00 |
La diferencia entre la hora local y UTC |
| Zona horaria con nombre | Europe/Paris |
Una zona cuyas reglas determinan los desfases aplicables |
RFC 3339 define representaciones de marcas de tiempo para instantes, incluidos los desfases numéricos y el indicador UTC Z. Excluye explícitamente de su alcance las descripciones de intervalos. Por lo tanto, un par de marcas de tiempo RFC 3339 aún requiere un acuerdo aparte sobre si se incluye el extremo. RFC 3339, alcance y formato de fecha y hora.
Por ejemplo, las marcas de tiempo ficticias 2027-06-18T12:00:00+02:00 y 2027-06-18T10:00:00Z identifican el mismo instante. Ninguna representa un día completo de publicación. Añadir una hora y un desfase a una fecha cambia la información que estás registrando. RFC 3339, desfases locales.
Una zona con nombre proporciona reglas para calcular la hora local y el desfase aplicable. IANA mantiene esas reglas, incluidos los cambios de desfase y el horario de verano; los proveedores de sistemas operativos y software distribuyen actualizaciones a los usuarios. Un único desfase numérico no puede sustituir ese conjunto de reglas al calcular límites en fechas distintas. Zonas horarias de IANA.
Para el marcador del calendario, conserva la fecha civil. Si una tarea posterior pregunta qué publicaciones con marca de tiempo corresponden a ese día, elige primero la zona con nombre que define el día de publicación y, luego, calcula en esa zona los dos instantes que marcan sus límites.
¿Cómo debe calcular una automatización de Mac el mismo rango?
Date de Foundation de Apple representa un instante independientemente del calendario o la zona horaria. Su nombre puede inducir a error cuando la entrada es simplemente el 18 de junio: una fecha civil necesita el contexto de un calendario antes de poder identificar un instante. Apple recomienda usar Calendar para los cálculos calendáricos. Date.
Para una automatización, especifica el sistema de calendario y la zona. Foundation expone la zona de un calendario mediante la propiedad modificable timeZone. Dejar explícita esa elección permite que quien mantenga la automatización vea cómo se define el día de publicación. Calendar.timeZone.
Dado un instante que se sabe que cae dentro del día previsto, Calendar.dateInterval(of: .day, for:) obtiene la hora de inicio y la duración de ese componente del calendario. El método devuelve un resultado opcional; una automatización debe gestionar los errores en lugar de sustituir silenciosamente la fecha por otra. dateInterval(of:for:).
Hay un detalle importante sobre los extremos: Apple documenta DateInterval como un intervalo cerrado que incluye ambos extremos. Para implementar un límite exclusivo del día de publicación, usa los límites calculados con una comparación explícita: start <= instant && instant < end. Esta es la regla de pertenencia, no un programa completo. DateInterval.
Evita suponer que todos los días locales comienzan a la medianoche habitual. startOfDay(for:) de Apple devuelve el primer instante existente del día: elige la primera medianoche si hay dos y el primer instante existente si no hay medianoche. Los límites derivados del calendario conservan esa distinción. startOfDay(for:).
Comprueba el límite antes de reutilizar la fecha
Para un flujo de trabajo basado en marcas de tiempo, aplica esta comprobación de aceptación de tres puntos al rango calculado. Los resultados previstos se deducen directamente de la comparación explícita con el extremo exclusivo.
| Instante de prueba | Pertenencia prevista |
|---|---|
| Exactamente al inicio del día | Incluido |
| Cualquier instante entre los límites, sin incluirlos | Incluido |
| Exactamente al inicio del día siguiente | Excluido |
Esta comprobación también explica por qué no hace falta inventar una hora final como 23:59:59. Si una entrada contiene fracciones de segundo, un valor posterior a ese límite elegido aún puede preceder al límite del día siguiente. Comparar con el límite exclusivo evita tener que elegir una precisión de marca de tiempo para «el último instante».
Para la tarea en el escritorio del Mac, termina comprobando que Día de publicación de muestra ocupe solo el 18 de junio y que la representación de la fecha exportada coincida con esa cobertura. Cuando el día se convierta más adelante en un filtro de marcas de tiempo, conserva el calendario y la zona elegidos, incluye el inicio y excluye el límite del día siguiente.
Fuentes
Configurar eventos de todo el día, de varios días o repetidos en Calendario en Mac — Apple.
RFC 5545: especificación del objeto central de calendarios y agendas de Internet (iCalendar) — RFC Editor.
RFC 3339: fecha y hora en Internet: marcas de tiempo — RFC Editor.
Zonas horarias — IANA.
Date — Documentación para desarrolladores de Apple.
timeZone — Documentación para desarrolladores de Apple.
dateInterval(of:for:) — Documentación para desarrolladores de Apple.
DateInterval — Documentación para desarrolladores de Apple.
startOfDay(for:) — Documentación para desarrolladores de Apple.