En utilisant cette free, open-source library:
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono_literals;
try
{
auto zone = locate_zone("America/New_York");
zone->to_sys(local_days{mar/13/2016} + 2h + 30min);
}
catch (const std::exception& e)
{
std::cout << e.what() << '\n';
}
}
La sortie de ce programme est:
2016-03-13 02:30 is in a gap between
2016-03-13 02:00:00 EST and
2016-03-13 03:00:00 EDT which are both equivalent to
2016-03-13 07:00:00 UTC
En bref, ce programme tente de traduire une date locale/heure de 2016- 03-13 02:30:00 à UTC en utilisant le fuseau horaire "America/New_York". La traduction émet une exception car l'heure locale n'existe pas. Une exception est également émise (avec un message d'erreur différent), si l'heure locale est ambiguë, par exemple lors du réglage de l'heure locale à partir de l'heure d'été.
La bibliothèque fournit également une syntaxe permettant d'éviter ces exceptions si tel est le souhait.
Cela fonctionne sur VS-2013, VS-2015, clang et gcc. Il nécessite C++ 11, C++ 14 ou C++ 1z.
Le lien ci-dessus pointe vers la documentation. Voici le dépôt GitHub:
https://github.com/HowardHinnant/date
Une question intrigante, certainement. Devez-vous également soutenir les deuxièmes jours intercalaires, comme le 30 juin 2015, 23 h 59,60? (Si c'est le cas, cela exclut l'API de temps de Google) I * think * booster les bibliothèques date-heure serait le meilleur point de départ.J'utilise ces librairies mais pas pour cette chose en particulier. – Bathsheba
J'ai tagué "boost-date-time" et, peut-être vilainement, "boost" car j'imagine qu'une solution peut être soit disponible hors de la boîte pour cela, soit pas particulièrement difficile à implémenter dans ce cadre. – Bathsheba
La bibliothèque C++ standard ne gère pas le temps. Si vous ciblez Windows, vous pouvez utiliser SystemTimeToFileTime() ou SystemTimeToTzSpecificLocalTime(). Passer une date incorrecte fait échouer la fonction avec ERROR_INVALID_PARAMETER. Si cela doit être multiplateforme, alors vous devez aller faire du shopping pour une bibliothèque. –