2009-06-30 8 views
1

En C++, ce qui est la façon la plus simple d'ajouter un jour à une date dans ce format:Date Boost ajouter un jour, chaîne GMT non standard

"20090629-05: 57: 43"

probablement à l'aide Boost 1,36 - Boost::date, Boost::posix_date ou toute autre amélioration ou fonctionnalité de la bibliothèque std, je ne suis pas intéressé par d'autres bibliothèques.

Jusqu'à présent, je suis venu avec:

  • Format

    la chaîne (date divisée et pièces de temps en op chaîne) pour pouvoir initialiser boost::gregorian::date, la date attend format comme:

    « 2009- 06-29 05:57:43"

    J'ai

    "20090629-05: 57: 43"

  • ajouter une journée (boost date_duration choses)

  • reconvertir to_simple_string et ajouter la partie de temps (opération string)

Y at-il moyen plus facile/niftier de le faire?

Je suis à la recherche de l'efficacité de l'exécution.

Exemple de code pour les étapes ci-dessus:

using namespace boost::gregorian; 
string orig("20090629-05:57:43"); 
string dday(orig.substr(0,8)); 
string dtime(orig.substr(8)); 

date d(from_undelimited_string(dday)); 
date_duration dd(1); 
d += dd; 
string result(to_iso_string(d) + dtime); 

Résultat:

20090630-05:57:43 

Répondre

1

qui est assez proche de la méthode la plus simple que je connaisse. A propos de la seule façon de le simplifier serait en outre en utilisant des facettes pour les E/S des choses, d'éliminer la nécessité d'une manipulation de chaînes:

#include <iostream> 
#include <sstream> 
#include <locale> 
#include <boost/date_time.hpp> 

using namespace boost::local_time; 

int main() { 
    std::stringstream ss; 
    local_time_facet* output_facet = new local_time_facet(); 
    local_time_input_facet* input_facet = new local_time_input_facet(); 
    ss.imbue(std::locale(std::locale::classic(), output_facet)); 
    ss.imbue(std::locale(ss.getloc(), input_facet)); 

    local_date_time ldt(not_a_date_time); 

    input_facet->format("%Y%m%d-%H:%M:%S"); 
    ss.str("20090629-05:57:43"); 
    ss >> ldt; 

    output_facet->format("%Y%m%d-%H:%M:%S"); 
    ss.str(std::string()); 
    ss << ldt; 

    std::cout << ss.str() << std::endl; 
} 

C'est plus, et sans doute plus difficile à comprendre, cependant. Je n'ai pas essayé de le prouver, mais je soupçonne qu'il s'agirait d'une durée d'exécution équivalente.

+0

+1, solution intéressante, je vais jeter un oeil. Je suppose que je pourrais réutiliser des facettes avec le format et juste passer la date à travers elle. – stefanB

+0

Je ne vois aucune raison que vous ne pourriez pas. Un point ajouté: puisque cela utilise l'heure locale, vous pourriez avoir un problème occasionnel avec les changements de l'heure d'été. Assez facile de se déplacer en réglant le fuseau horaire sur GMT, mais c'est quelque chose à considérer. –

+0

dans mon cas particulier, je fais face à l'heure GMT – stefanB

Questions connexes