Comment faire pour obtenir l'heure actuelle de la zone?
Dans la plupart des exemples que j'avais vu:
time_zone_ptr zone( new posix_time_zone("MST-07") );
Mais je veux juste que le fuseau horaire actuel de la machine qui exécute le code. Je ne veux pas coder en dur le nom du fuseau horaire.
Vous devez vous connecter pour publier un commentaire.
Plaine posix: appel tzset, utilisez tzname.
Posix avec la glibc/bsd ajouts:
Ci-dessus sont abrégés Posix fuseaux horaires, définie en termes de décalage de l'heure UTC et pas stable dans le temps (il y a une forme longue qui peut inclure de l'heure d'été transitions, mais pas de politique et historique des transitions).
ICU est portable et de la logique pour la récupération du système fuseau horaire comme un Olson fuseau horaire (extrait par sumwale):
Sur Linux, unité de soins intensifs est mis en œuvre pour être compatible avec tzset et regarde
TZ
et/etc/localtime
, qui sur les récents systèmes Linux est specced à être un lien symbolique contenant le Olson (identificateur devoici l'histoire). Voiruprv_tzname
pour les détails de mise en œuvre.Boost ne sais pas comment utiliser le Olson identificateur. Vous pourriez construire un
posix_time_zone
en utilisant le non de l'heure d'été et l'heure d'été décalages, mais à ce stade, il est préférable de garder à l'aide de l'unité de soins intensifs de mise en œuvre. Voir ce coup de pouce FAQ._get_tzname()
retourne un nom, comme "Pacific Standard Time"; du coup de pouceposix_time_zone
veut quelque chose comme "PST". Aussi, btw,tzname
(POSIX standard, l'appelle_tzname
) est un 2-D char tableau. [MSVC fournit également unTZNAME_MAX
, si vous#define _POSIX_
, mais à 10, apparemment une surveillance à partir d'une mise en œuvre plus haut.]_tzset()
ne fonctionne que pour le décalage UTC, mais n'est pas en mesure d'interpréter correctement l'heure d'été changer les définitions de la variable TZ (en particulier les règles sont codés en dur).Assez tard dans la journée, mais je cherchais quelque chose de semblable si cela peut espérer aider les autres. La suite (sans boost) utilisant strftime semble fonctionner sur la plupart des plateformes:
Ou on peut utiliser std::time_put pour un pur C++ version.
Bien, peut-être que vous pourriez le faire à l'aide de la GeoIP bibliothèque. Je sais que c'est un peu exagéré, mais puisque la plupart des ordinateurs dans le monde sont connectés à l'internet, vous pouvez probablement vous en sortir avec elle. Selon le gars que je suis en développement, il ya plus de 99% de précision.
Note: C'est une idée stupide. Je suis juste d'étirement pour les réponses.
Afin de bien répondre à cette question, il est important de comprendre que le temps de charge des zones de suralimentation est sévèrement limitée.
C'est principalement axé sur POSIX fuseaux horaires, qui ont plusieurs limitations. Ces limites sont discutées dans la POSIX section de le fuseau horaire de la balise wiki, donc je ne vais pas les répéter ici.
Il a des fonctions qui fonctionnent avec de l'IANA Id/Olson fuseaux horaires, mais artificiellement les cartes de ces POSIX valeurs - ce qui a pour effet d'aplatir le fuseau horaire à un point unique dans l'histoire. Ces mappages sont stockées dans un fichier csv dans l'élan de code source.
Le fichier csv n'a pas été mis à jour depuis avril 2011, et il y a eu de nombreux les changements de fuseaux horaires depuis. Ainsi, les mappages il ne sont quelque peu inexacte.
En général, je ne recommande pas de coup de pouce pour travailler avec les fuseaux horaires. Au lieu de cela, envisager de le ICU Fuseau horaire Classes, qui font partie de la ICU projet. Vous trouverez ces totalement portable, et ils ont correctes et complètes au moment de la zone de soutien.
Il vaut la peine de mentionner que d'ICU est utilisé dans de nombreuses applications populaires. Par exemple, le navigateur web Google Chrome obtient elle est en charge des fuseaux horaires de l'ICU.
En soins intensifs, l'actuel système local de fuseau horaire est disponible sur la par défaut fuseau horaire. Vous pouvez en savoir plus dans la section "Méthodes de fabrique et le Fuseau horaire par Défaut" dans l'unité de soins intensifs de la documentation.
time_zone_ptr
correctement définie sur la machine du fuseau horaire actuel de façon portable - c'est ce que la question demande. Vous pouvez imaginer que je préfère ne pas en ajouter une autre dépendance, et la question est à propos de boost, mais si la seule possibilité est d'utiliser des soins intensifs alors ainsi soit-il. Malheureusement, cette partie de votre réponse, la seule partie qui est directement pertinent, est lien-seulement.Vous pouvez toujours essayer d'obtenir le temps universel et l'heure locale de boost et de la vérification de la différence, c'est probablement plein de mises en garde bien.