En C++20 (selon le spécification provisoire pour C++20 telle qu'elle se présente aujourd'hui), vous pourrez dire :
#include
#include
int
main()
{
using namespace std;
using namespace std::chrono;
cout << sys_seconds{1205812558s} << '\n';
cout << sys_seconds{32879409516s} << '\n';
}
et cela va afficher :
2008-03-18 03:55:58
3011-11-28 17:18:36
Il s'agit d'horodatages en UTC.
Vous pouvez utiliser la bibliothèque de dates de Howard Hinnant pour expérimenter avec cette fonctionnalité étendue dès aujourd'hui en ajoutant :
#include "date/date.h"
et
using namespace date;
au programme ci-dessus. Vous pouvez expérimenter en ligne avec ce programme ici.
Un commentaire ci-dessous demande à quoi cela ressemble si la valeur est stockée dans uint64_t
. La réponse est que vous devez convertir le type intégral en seconds
, puis les seconds
en sys_seconds
:
uint64_t i = 1205812558;
cout << sys_seconds{seconds(i)} << '\n';
Il existe des limites à cette fonctionnalité contemporaine, mais elles se situent aux alentours des années +/-32K (bien au-delà des limites de l'exactitude du calendrier civil actuel).
Pour être totalement transparent, il existe des moyens de le faire en utilisant seulement C++98/11/14/17, mais ils sont plus compliqués que cela, et sont sujets à des bugs de multithreading. Cela est dû à l'utilisation d'une API C désuète qui a été conçue avant l'avènement de choses comme le multithreading et le C++, et quand l'année 2001 n'était associée qu'à la science-fiction (par exemple gmtime
).