Come ottenere il fuso orario corrente?

Nella maggior parte degli esempi che avevo visto:

time_zone_ptr zone( new posix_time_zone("MST-07") ); 

Ma voglio solo per ottenere il fuso orario corrente per la macchina che esegue il codice. Non voglio codificare il nome del fuso orario.



5 Replies
  1. 10

    Pianura posix: chiamata tzset, utilizzare tzname.

    #include <ctime>
    tzset();
    time_zone_ptr zone(new posix_time_zone(tzname[localtime(0)->tm_isdst]));

    Posix con glibc/bsd aggiunte:

    time_zone_ptr zone(new posix_time_zone(localtime(0)->tm_zone));

    Di cui sopra sono abbreviati Posix fusi orari, definito in termini di scostamento dall’UTC e non stabile nel tempo (c’è una forma più lunga che può includere l’ora legale transizioni, ma non politico e storico transizioni).

    ICU è portatile e ha una logica per il recupero di il sistema di fuso orario come Olson fuso orario (frammento da sumwale):

    //Link with LDLIBS=`pkg-config icu-i18n --libs`
    #include <unicode/timezone.h>
    #include <iostream>
    
    using namespace U_ICU_NAMESPACE;
    
    int main() {
      TimeZone* tz = TimeZone::createDefault();
      UnicodeString us;
      std::string s;
    
      tz->getID(us);
      us.toUTF8String(s);
      std::cout << "Current timezone ID: " << s << '\n';
      delete tz;
    }

    Su Linux, ICU è realizzato per essere compatibile con tzset e guarda TZ e /etc/localtime, che sui recenti sistemi Linux è speccato sia un link simbolico che contiene il Olson identificatore (ecco la storia). Vedere uprv_tzname per i dettagli di implementazione.

    La spinta non sai come utilizzare la Olson identificatore. Si potrebbe costruire un posix_time_zone non DST e DST offset, ma a questo punto, è meglio continuare a utilizzare l’unità di terapia intensiva di attuazione. Vedere questo aumento della FAQ.

    • Non posso parlare per gli altri ambienti, ma MSVS 2008 implementazione di _get_tzname() restituisce un nome, come “Pacific Standard Time”; Spinta del posix_time_zone vuole qualcosa come “PST”. Inoltre, btw, tzname (POSIX standard chiama _tzname) è un 2-D char array. [MSVC fornisce, inoltre, una TZNAME_MAX, se si #define _POSIX_, ma impostato a 10, a quanto pare una svista da una precedente realizzazione.]
    • Ho scritto “Boost vogliono qualcosa come “PST”, che è stato leggermente imprecise; Spinta vuole qualcosa come “PST-8”. È possibile utilizzare una falsa etichetta; dal momento che non ho intenzione di visualizzare il TZ, mi basta capire il bias e utilizzare “XXT-8”.
    • Un altro fatto è che, anche lavorando intorno a @MikeC ‘s problema, questo ancora non funziona, in MSVC. Anche utilizzando _tzset() funziona solo per UTC offset, ma non interpretare correttamente la modifica dell’ora legale definizioni di variabile TZ (alcune particolari regole CI sono hardcoded).
    • “Si potrebbe costruire un posix_time_zone non DST e DST offset” – sì, è esattamente quello che vorrei fare (e che cosa rispondere alla domanda). Il vantaggio è che potrebbe nascondere l’unità di terapia intensiva dipendenze (fuso orario e unicode relative classi), quando lavoro con boost ovunque già.
  2. 4

    Abbastanza in ritardo, ma stavo cercando qualcosa di simile, quindi, auspicabilmente, aiutare gli altri. Il seguente (non turbo), utilizzando strftime sembra funzionare su più piattaforme:

      time_t ts = 0;
      struct tm t;
      char buf[16];
      ::localtime_r(&ts, &t);
      ::strftime(buf, sizeof(buf), "%z", &t);
      std::cout << "Current timezone: " << buf << std::endl;
      ::strftime(buf, sizeof(buf), "%Z", &t);
      std::cout << "Current timezone: " << buf << std::endl;

    O si può usare std::time_put per puro C++ versione.

  3. 1

    Bene, forse si potrebbe fare usando la libreria GeoIP. So che è un po ‘ eccessivo, ma dal momento che la maggior parte dei computer del mondo sono connessi a internet, si potrebbe probabilmente ottenere via con esso. Secondo il ragazzo che sto sviluppando per, è stato di oltre il 99% di precisione.

    Nota: Questa è un’idea stupida. Io sono solo stretching per le risposte.

    • Sì, è stupido, ma è dannatamente creativo!
  4. 1

    Per rispondere correttamente a questa domanda, è importante capire che il supporto del fuso orario in Boost è severamente limitato.

    • È concentrata principalmente su sistemi POSIX fusi orari, che hanno diverse limitazioni. Queste limitazioni sono discussi in POSIX sezione di il fuso orario tag wiki, quindi non mi ripeto qui.

    • Ha funzioni che lavorano con gli Id di IANA/Olson fusi orari, ma artificialmente le mappe di questi POSIX valori – che ha l’effetto di appiattire il fuso orario per un solo punto nella storia. Queste associazioni sono memorizzati in un file csv nella Boost codice sorgente.

    • Il file csv non è stato più aggiornato dal mese di aprile 2011, e ci sono stati molti modifiche alle zone di tempo da allora. Così, il mapping è non sono un po ‘ impreciso.

    In generale, non mi consiglia di Spinta per lavorare con i fusi orari. Invece, considerare l’ ICU Fuso orario Classi, che sono parte del ICU progetto. Troverete questi per essere completamente portatile, e hanno il completo e corretto il supporto del fuso orario.

    Vale la pena ricordare che l’ICU è utilizzato in molte applicazioni popolari. Per esempio, il browser web Google Chrome ottiene il supporto del fuso orario dal reparto di terapia intensiva.

    Nel reparto di terapia intensiva, l’attuale sistema locale del fuso orario è disponibile come default di fuso orario. Si può leggere di più nella sezione “La fabbrica di Metodi e il Fuso orario Predefinito” in terapia intensiva documentazione.

    • Grazie. Mentre questa collaborazione è preziosa e, purtroppo, non risponde alla domanda a tutti 🙂 so che l’incremento di limiti e so che su di terapia intensiva (infatti, di incrementare la documentazione stessa consiglia di utilizzare invece di boost 🙂 ).
    • potrebbe per favore spiegare in cosa tipo di risposta che cerchi, allora? Grazie.
    • Che cosa si intende per “tipi”? Qualsiasi genere, che dimostra come l’hanno spinta del time_zone_ptr impostare correttamente alla macchina fuso orario attuale in un portatile di modo che la domanda chiede. Si può immaginare che io preferisco non aggiungere un’altra dipendenza, e la questione è di circa boost, ma se l’unica possibilità è quella di utilizzare la terapia intensiva allora così sia. Purtroppo, questa parte della tua risposta, l’unica parte che direttamente rilevante, il link solo.
  5. 0

    Si potrebbe sempre provare a ottenere il tempo universale e locale, il tempo di spinta e di controllo la differenza, probabilmente è piena di avvertimenti, però.

    • No. Ottenere l’ora locale di Spinta con una corretta TZ offset richiede l’impostazione di un corretto TZ offset prima.
    • Oh, che schifo 🙁
    • In realtà, penso che il mio commento precedente era sbagliato, ma non ho indagato più a fondo per capire. C’è un orologio e un posix orologio.

Lascia un commento