Calendario y zonas horarias
Use los tipos de calendario de C++20
Calendario y zonas horarias es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
Tipos de calendario de C++20
C++20 añadió una compatibilidad completa con calendarios a <chrono>. Ahora puede expresar directamente años, meses y días mediante tipos, en lugar de manipular números enteros.
year,month,dayyear_month_daypara representar una fecha completa
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
year y{2026};
std::cout << "Year value: " << static_cast<int>(y) << '\n';
return 0;
}Literales de calendario
Los literales de calendario, como 2026y y 15d, junto con meses con nombre como std::chrono::May, hacen que las fechas resulten naturales de leer.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto y = 2026y;
auto d = 15d;
std::cout << static_cast<int>(y) << " / " << static_cast<unsigned>(d) << '\n';
return 0;
}Construcción de una fecha
Combine las tres partes con el operador / para formar un year_month_day. El orden es año, mes y día.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
year_month_day ymd = 2026y/May/30;
std::cout << static_cast<int>(ymd.year()) << "-"
<< static_cast<unsigned>(ymd.month()) << "-"
<< static_cast<unsigned>(ymd.day()) << '\n';
return 0;
}Validación de fechas
Un year_month_day sabe si representa una fecha real del calendario. Use ok() para rechazar valores imposibles, como el 30 de febrero.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
year_month_day good = 2026y/February/28;
year_month_day bad = 2026y/February/30;
std::cout << std::boolalpha << good.ok() << " " << bad.ok() << '\n';
return 0;
}sys_days
Convierta una fecha a sys_days, que representa un número de días desde la época. Esto permite realizar operaciones con días y calcular diferencias entre fechas.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
sys_days a = sys_days{2026y/May/30};
sys_days b = sys_days{2026y/May/20};
std::cout << "Days apart: " << (a - b).count() << '\n';
return 0;
}Operaciones con días
Al sumar days{n} a un sys_days, avanza n días; después puede volver a convertir el resultado en una fecha de calendario.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
sys_days start = sys_days{2026y/May/30};
sys_days later = start + days{10};
year_month_day ymd = later;
std::cout << static_cast<unsigned>(ymd.day()) << "/"
<< static_cast<unsigned>(ymd.month()) << '\n';
return 0;
}Día de la semana
Convierta un sys_days en un weekday para averiguar en qué día de la semana cae una fecha.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
weekday wd{sys_days{2026y/May/30}};
std::cout << "Weekday index (Sun=0): " << wd.c_encoding() << '\n';
return 0;
}Último día de un mes
La etiqueta especial last calcula el último día de cualquier mes y gestiona automáticamente los años bisiestos.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
year_month_day_last eom = 2024y/February/last;
year_month_day ymd = eom;
std::cout << "Feb 2024 ends on day " << static_cast<unsigned>(ymd.day()) << '\n';
return 0;
}Comprobación de año bisiesto
El tipo year proporciona is_leap(), por lo que no tiene que recordar las reglas de divisibilidad.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
std::cout << std::boolalpha;
std::cout << "2024 leap: " << year{2024}.is_leap() << '\n';
std::cout << "2026 leap: " << year{2026}.is_leap() << '\n';
return 0;
}De un punto temporal a una fecha
Aplique floor a un punto temporal de system_clock para obtener days y conviértalo en un year_month_day para obtener la fecha de hoy.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto today = floor<days>(system_clock::now());
year_month_day ymd = sys_days{today};
std::cout << "Year is in range: " << (static_cast<int>(ymd.year()) > 2000) << '\n';
return 0;
}Zonas horarias
C++20 también añade zonas horarias mediante std::chrono::zoned_time y la base de datos de IANA. La disponibilidad depende de su biblioteca estándar, pero este modelo combina un punto temporal con una zona con nombre para mostrar correctamente la hora local.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto now = system_clock::now();
auto days_part = floor<days>(now);
std::cout << "Have a UTC time point: " << (days_part.time_since_epoch().count() > 0) << '\n';
return 0;
}Comprobación rápida
Compruebe cuánto entiende de los tipos de calendario de C++20.
Resumen
Ha aprendido sobre la compatibilidad con calendarios de C++20:
year,month,dayyyear_month_daycon el constructor mediante/- la validación con
ok()y las comprobaciones conis_leap() sys_dayspara realizar operaciones con días y consultar el día de la semanalastpara obtener el final del mes, además de una introducción azoned_time
Con esto termina el curso Time and the Chrono Library.
Preguntas frecuentes
¿La lección «Calendario y zonas horarias» es gratis?
Sí — el texto completo de «Calendario y zonas horarias» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Calendario y zonas horarias»?
Use los tipos de calendario de C++20 Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Calendario y zonas horarias»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Duraciones y relojes
- Puntos temporales
- Medición del rendimiento del código
- Calendario y zonas horarias