È possibile estrarre queste informazioni solo da system_clock::time_point
. Questo è l'unico orologio fornito dal sistema che ha una relazione con il calendario civile. Ecco come ottenere il time_point corrente utilizzando questo orologio:
system_clock::time_point now = system_clock::now();
È quindi possibile convertire questo ad un time_t
con:
time_t tt = system_clock::to_time_t(now);
Utilizzando la libreria C è possibile convertire un time_t
ad un tm
, ma è necessario scegliere se si desidera che la conversione avvenga nel fuso orario UTC, oppure fuso orario locale:
tm utc_tm = *gmtime(&tt);
tm local_tm = *localtime(&tt);
Poi si c una stampa i componenti del tm, ad esempio:
std::cout << local_tm.tm_year + 1900 << '\n';
std::cout << local_tm.tm_mon + 1 << '\n';
std::cout << local_tm.tm_mday << '\n';
Inoltre
Se si desidera, è possibile usufruire di queste informazioni non garantiti:
Ogni implementazione di system_clock
I ne sono a conoscenza in base a unix time. Cioè il numero di secondi da New Years 1970 UTC, trascurando secondi bisestili. E la precisione di questo conteggio è solitamente più fine di secondi. Ecco un programma completo che estrae tutte queste informazioni:
#include <chrono>
#include <ctime>
#include <iostream>
int
main()
{
using namespace std;
using namespace std::chrono;
typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days;
system_clock::time_point now = system_clock::now();
system_clock::duration tp = now.time_since_epoch();
days d = duration_cast<days>(tp);
tp -= d;
hours h = duration_cast<hours>(tp);
tp -= h;
minutes m = duration_cast<minutes>(tp);
tp -= m;
seconds s = duration_cast<seconds>(tp);
tp -= s;
std::cout << d.count() << "d " << h.count() << ':'
<< m.count() << ':' << s.count();
std::cout << " " << tp.count() << "["
<< system_clock::duration::period::num << '/'
<< system_clock::duration::period::den << "]\n";
time_t tt = system_clock::to_time_t(now);
tm utc_tm = *gmtime(&tt);
tm local_tm = *localtime(&tt);
std::cout << utc_tm.tm_year + 1900 << '-';
std::cout << utc_tm.tm_mon + 1 << '-';
std::cout << utc_tm.tm_mday << ' ';
std::cout << utc_tm.tm_hour << ':';
std::cout << utc_tm.tm_min << ':';
std::cout << utc_tm.tm_sec << '\n';
}
E 'utile per creare un costume duration
per modellare giorni:
typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days;
Ora è possibile ottenere il tempo dal momento che l'epoca, come multare una precisione in quanto in grado di gestire, con:
system_clock::duration tp = now.time_since_epoch();
Poi troncare a giorni, e sottrarre che fuori.
Quindi troncarlo a ore e sottrarlo.
Continua fino a quando non hai sottratto i secondi.
Quello che ti rimane è la frazione di secondo con le unità di system_clock::duration
. Quindi stampa il valore del tempo di esecuzione e le unità del tempo di compilazione di quel valore come mostrato.
Per me questo programma stampa:
15806d 20:31:14 598155[1/1000000]
2013-4-11 20:31:14
La mia uscita indica la precisione system_clock::duration
è microsecondi.Se lo si desidera, che può essere troncato a millisecondi con:
milliseconds ms = duration_cast<milliseconds>(tp);
Aggiornamento
This header-only C++11/14 library incapsula il lavoro di cui sopra, riducendo lavoro client verso il basso per:
#include "date.h"
#include <iostream>
int
main()
{
// Reduce verbosity but let you know what is in what namespace
namespace C = std::chrono;
namespace D = date;
namespace S = std;
auto tp = C::system_clock::now(); // tp is a C::system_clock::time_point
{
// Need to reach into namespace date for this streaming operator
using namespace date;
S::cout << tp << '\n';
}
auto dp = D::floor<D::days>(tp); // dp is a sys_days, which is a
// type alias for a C::time_point
auto ymd = D::year_month_day{dp};
auto time = D::make_time(C::duration_cast<C::milliseconds>(tp-dp));
S::cout << "year = " << ymd.year() << '\n';
S::cout << "month = " << ymd.month() << '\n';
S::cout << "day = " << ymd.day() << '\n';
S::cout << "hour = " << time.hours().count() << "h\n";
S::cout << "minute = " << time.minutes().count() << "min\n";
S::cout << "second = " << time.seconds().count() << "s\n";
S::cout << "millisecond = " << time.subseconds().count() << "ms\n";
}
Quale appena uscita per me:
2015-07-10 20:10:36.023017
year = 2015
month = Jul
day = 10
hour = 20h
minute = 10min
second = 36s
millisecond = 23ms
possibile duplicato di [Ho w per convertire std :: chrono :: time \ _point in stringa datetime del calendario con secondi frazionari?] (http://stackoverflow.com/questions/12835577/how-to-convert-stdchronotime-point-to-calendar-datetime- stringa-con-frazione) – Ali