2010-04-10 13 views
12

Si je fais date +%H-%M-%S sur la ligne de commande (Debian/Lenny), je reçois un temps convivial (pas UTC, pas DST-moins, le temps qu'une personne normale a sur leur montre-bracelet) temps imprimé.Le moyen le plus simple d'obtenir l'heure actuelle dans le fuseau horaire en utilisant boost :: date_time?

Quel est le moyen le plus simple d'obtenir la même chose avec boost::date_time?

Si je fais ceci:

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; 

Alors msg.str() est une heure plus tôt que le temps que je veux voir. Je ne suis pas sûr si c'est parce qu'il montre UTC ou temps de fuseau horaire local sans correction d'heure d'été (je suis au Royaume-Uni).

Quelle est la manière la plus simple de modifier ce qui précède pour obtenir le fuseau horaire local corrigé par DST? J'ai une idée que cela implique boost::date_time:: c_local_adjustor mais ne peut pas le comprendre à partir des exemples.

+2

Je crois qu'il s'agit d'un doublon de http://stackoverflow.com/questions/2492775/get-local-time-with-boost/2493977. Version courte: Utilisez boost: posix_time pour construire un objet temporel à partir de l'horloge système. Cela fonctionne très bien pour l'heure locale (l'environnement local 'C'). La possibilité de créer des heures pour d'autres fuseaux horaires dépend des paramètres régionaux disponibles. – Nate

+0

Merci pour le pointeur; problème fondamental est que je n'avais pas vraiment apprécié la différence entre local_time/posix_time. – timday

Répondre

17

Cela fait ce que je veux:

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; 
+15

Il a dit un moyen simple. Il n'y a pas de moyen simple avec Boost date/heure. Ils ont abstrait et généralisé * trop. * –

+3

Je pense que c'est un peu dur (mais pas complètement injustifié). Ce qui précède est assez simple (bien que verbeux avec tout le namespacing). Le problème est souvent plus la documentation vous dit comment se rendre à Alpha Centauri quand vous avez juste voulu marcher autour du bloc. D'un autre côté, je voulais faire la même chose en Python il y a un certain temps, et cela n'avait pas besoin d'un post sur StackOverflow pour fonctionner. – timday

+1

ne me lancez pas dans ma première expérience avec 'posix time' de boost et comme je pensais que ce serait facile d'obtenir un horodatage POSIX et comment j'avais tort! Cela dit nous serions tous perdus sans Boost –

4

Bien que cela n'utilise pas boost :: DATE_TIME il est relativement facile avec boost :: locale, ce qui est tout à fait plus adapté à cette tâche. Comme votre besoin est simplement obtenir une heure formatée à partir des paramètres régionaux en cours.

IMHO boost :: date_time devrait être utilisé lorsque vous manipulez des logiciels comme les calculs de gantt/planning, si vous avez beaucoup d'arithmétique date_time. Mais simplement pour utiliser le temps et faire de l'arithmétique, vous réussirez plus vite avec 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; 
} 

À l'heure actuelle, il devrait afficher: 15-45-48. :)