Utilizzando questo 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';
}
}
L'uscita di questo programma è:
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
In breve, questo programma tenta di tradurre una data locale/ora 2016- 03-13 02:30:00 UTC utilizzando il fuso orario "America/New_York". La traduzione genera un'eccezione perché l'ora locale non esiste. Viene generata anche un'eccezione (con un messaggio di errore diverso), se l'ora locale è ambigua, ad esempio quando si ripristina l'orologio locale dall'ora legale.
La libreria fornisce anche la sintassi per evitare queste eccezioni se questo è il desiderio.
Questo funziona su VS-2013, VS-2015, clang e gcc. Richiede C++ 11, C++ 14 o C++ 1z.
Il collegamento sopra indica la documentazione. Ecco il repository GitHub:
https://github.com/HowardHinnant/date
fonte
2016-04-10 15:08:33
Una domanda intrigante, certamente. Hai anche bisogno di supportare il secondo giorno bisestile, come il 30 giugno 2015, 23.59.60? (Se è così che esclude l'API temporale di Google) I * think * incrementa le librerie date-time sarebbe il miglior punto di partenza.Io uso quelle librerie ma non per questa particolare cosa. – Bathsheba
Ho taggato "boost-date-time" e, forse con cattiveria, "boost" poiché immagino che una soluzione possa essere disponibile per questo fuori dalla scatola, o non particolarmente difficile da implementare in quel framework. – Bathsheba
La libreria C++ standard non è adatta a gestire il tempo. Se scegli come target Windows, puoi utilizzare SystemTimeToFileTime() o SystemTimeToTzSpecificLocalTime(). Il superamento di una data errata rende la funzione fallita con ERROR_INVALID_PARAMETER. Se deve essere multipiattaforma, devi andare a fare shopping per una biblioteca. –