Modo più semplice per ottenere l'ora corrente nel fuso orario corrente usando boost :: date_time?
-
25-09-2019 - |
Domanda
Se lo faccio date +%H-%M-%S
Sulla linea di comando (Debian/Lenny), ottengo un tempo intuitivo (non UTC, non senza DST, il tempo che una persona normale ha sul proprio orologio da polso) stampato.
Qual è il modo più semplice per ottenere la stessa cosa boost::date_time
?
Se lo faccio:
std::ostringstream msg;
boost::local_time::local_date_time t =
boost::local_time::local_sec_clock::local_time(
boost::local_time::time_zone_ptr()
);
boost::local_time::local_time_facet* lf(
new boost::local_time::local_time_facet("%H-%M-%S")
);
msg.imbue(std::locale(msg.getloc(),lf));
msg << t;
Quindi msg.str()
è un'ora prima del tempo che voglio vedere. Non sono sicuro che ciò sia dovuto al fatto che sta mostrando UTC o tempo di fuso orario senza una correzione DST (sono nel Regno Unito).
Qual è il modo più semplice per modificare quanto sopra per produrre il tempo di flusso locale corretto DST? Ho un'idea che implica boost::date_time:: c_local_adjustor
Ma non riesco a capirlo dagli esempi.
Soluzione
Questo fa quello che voglio:
namespace pt = boost::posix_time;
std::ostringstream msg;
const pt::ptime now = pt::second_clock::local_time();
pt::time_facet*const f = new pt::time_facet("%H-%M-%S");
msg.imbue(std::locale(msg.getloc(),f));
msg << now;
Altri suggerimenti
Anche se questo non sta usando boost :: date_time è relativamente facile con boost :: locale, che è molto più adatto per questo compito. Come il vostro bisogno è semplicemente ottenere un tempo formattato dal locale corrente.
IMHO boost :: date_time dovrebbe essere usato quando avete a che fare con software come i calcoli di Gantt / pianificazione, erano avete un sacco di DATE_TIME aritmetica. Ma semplicemente per l'utilizzo di tempo e fare un po 'di aritmetica su di esso, si vuole il successo più velocemente con boost :: locale.
#include <iostream>
#include <boost/locale.hpp>
using namespace boost;
int main(int argc, char **argv) {
locale::generator gen;
std::locale::global(gen(""));
locale::date_time now;
std::cout.imbue(std::locale());
std::cout << locale::as::ftime("%H-%M-%S") << now << std::endl;
return 0;
}
In questo momento si deve uscita: 15-45-48. :)