Nouvelle réponse à une ancienne question:
La question ne précise pas dans quel fuseau horaire. Il existe deux possibilités raisonnables:
- En UTC.
- Dans le fuseau horaire local de l'ordinateur.
Pour 1, vous pouvez utiliser cette bibliothèque de dates et le programme suivant:
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
std::cout << system_clock::now() << '\n';
}
Ce qui vient de sortir pour moi:
2015-08-18 22:08:18.944211
La bibliothèque de dates ajoute essentiellement un opérateur de streaming pour std::chrono::system_clock::time_point
. Il ajoute également beaucoup d'autres fonctionnalités intéressantes, mais qui ne sont pas utilisées dans ce programme simple.
Si vous préférez 2 (l'heure locale), il existe une bibliothèque de fuseaux horaires qui s'appuie sur la bibliothèque de dates . Ces deux bibliothèques sont open source et multiplateforme , en supposant que le compilateur prend en charge C ++ 11 ou C ++ 14.
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
auto local = make_zoned(current_zone(), system_clock::now());
std::cout << local << '\n';
}
Ce qui pour moi vient de sortir:
2015-08-18 18:08:18.944211 EDT
Le type de résultat de make_zoned
est un date::zoned_time
qui est un appariement de a date::time_zone
et de a std::chrono::system_clock::time_point
. Cette paire représente une heure locale, mais peut également représenter UTC, selon la façon dont vous l'interrogez.
Avec la sortie ci-dessus, vous pouvez voir que mon ordinateur est actuellement dans un fuseau horaire avec un décalage UTC de -4h et une abréviation d'EDT.
Si un autre fuseau horaire est souhaité, cela peut également être accompli. Par exemple, pour trouver l'heure actuelle à Sydney, en Australie, il suffit de changer la construction de la variable local
en:
auto local = make_zoned("Australia/Sydney", system_clock::now());
Et la sortie se transforme en:
2015-08-19 08:08:18.944211 AEST
Mise à jour pour C ++ 20
Cette bibliothèque est maintenant largement adoptée pour C ++ 20. L'espace de noms a date
disparu et tout est std::chrono
maintenant dans l'espace de noms . Et utiliser zoned_time
à la place de make_time
. Déposez les en-têtes "date.h"
et "tz.h"
et utilisez simplement <chrono>
.
Au moment où j'écris ces lignes, des implémentations partielles commencent à peine à émerger sur certaines plateformes.