example - Extraiga año/mes/día, etc. de std:: chrono:: time_point en C++
steady_clock c++ (1)
¿Cómo puedo extraer el año, mes, día, hora, minuto, segundo y milisegundo de un objeto std::chrono::time_point
?
Solo vi ejemplos sobre cómo extraer la cantidad total de, por ejemplo, segundos de una duration
.
Solo puede extraer esta información de un system_clock::time_point
. Este es el único reloj suministrado por el sistema que tiene una relación con el calendario civil. Aquí es cómo obtener el punto de tiempo actual usando este reloj:
system_clock::time_point now = system_clock::now();
A continuación, puede convertir esto a time_t
con:
time_t tt = system_clock::to_time_t(now);
Con la biblioteca C, puede convertir un time_t
en tm
, pero debe elegir si quiere que la conversión se realice en la zona horaria UTC o en su zona horaria local:
tm utc_tm = *gmtime(&tt);
tm local_tm = *localtime(&tt);
Luego puede imprimir los componentes de la tm, por ejemplo:
std::cout << local_tm.tm_year + 1900 << ''/n'';
std::cout << local_tm.tm_mon + 1 << ''/n'';
std::cout << local_tm.tm_mday << ''/n'';
Adicionalmente
Si lo desea, puede aprovechar esta información no garantizada:
Cada implementación de system_clock
que tengo conocimiento se basa en el tiempo de Unix . Es decir, la cantidad de segundos desde Año Nuevo 1970 UTC, descuidando los segundos intercalares. Y la precisión de este conteo es generalmente más fina que segundos. Aquí hay un programa completo que extrae toda esta información:
#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'';
}
Es útil crear una duration
personalizada para días modelo:
typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days;
Ahora puede obtener el tiempo transcurrido desde la época, con la mayor precisión posible, con:
system_clock::duration tp = now.time_since_epoch();
A continuación, trunque a días y reste eso.
Luego, trunquelo en horas, y reste eso.
Continúa hasta restar los segundos.
Lo que te queda es la fracción de segundo con las unidades de system_clock::duration
. Así que imprima ese valor de tiempo de ejecución y las unidades de tiempo de compilación de ese valor como se muestra.
Para mí este programa imprime:
15806d 20:31:14 598155[1/1000000]
2013-4-11 20:31:14
Mi salida indica que la precisión de system_clock::duration
es microsegundos. Si lo desea, se puede truncar a milisegundos con:
milliseconds ms = duration_cast<milliseconds>(tp);
Actualizar
Esta biblioteca de solo encabezado C ++ 11/14 encapsula el trabajo anterior, reduciendo el trabajo del cliente a:
#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";
}
Que me acaba de dar salida:
2015-07-10 20:10:36.023017
year = 2015
month = Jul
day = 10
hour = 20h
minute = 10min
second = 36s
millisecond = 23ms