Question

Je souhaite utiliser la bibliothèque date_time dans Boost pour représenter l'heure dans mon application. Cette application générera des flux Atom, qui à leur tour exigeront des horodatages au format spécifié dans la RFC 3339 , par exemple " 1990-12-31T23: 59: 60Z " ou " 1990-12-31T15: 59: 60-08: 00 ".

Alors, comment formater l'heure en fonction de cette RFC?

J'ai lu le la saisie de l'heure / de la date / Produisez de la documentation toute la journée et je n'arrive pas à trouver comment mettre le Z à la fin lorsque j'en ai besoin. En outre, la RFC prend en charge une fraction de seconde facultative, mais un seul chiffre (par exemple. & Quot; 1990-12-31T23: 59: 60.5Z & Quot;) (*). Je n'arrive pas à savoir comment faire cela non plus.

Je pourrais toujours écrire ma propre routine de formatage qui lit les différents champs nécessaires, mais cela me semble aller à l'encontre du grain de la <=> bibliothèque.

Avez-vous déjà utilisé le formatage pour cette bibliothèque? Ou est-ce que je fais la mauvaise chose?

(*): Il me semble que l’ABNF indiqué dans le RFC autorise uniquement les secondes fractionnaires à un chiffre, mais les exemples du même document RFC comportent des secondes fractionnaires à deux chiffres. Qu'est-ce que c'est censé vouloir dire?

Était-ce utile?

La solution

  1. ABNF from RFC says that there must be at least one digit after dot, there is no defined maximum.

  2. There is no real need for the Z, you can use 00:00 instead, and this is possible with facets

  3. In some rare circumstances date_time will generate a "Z". See code snapshot from boost (local_date_time.hpp) that suggests this is below:


    std::string zone_name(bool as_offset=false) const
    {
      if(zone_ == boost::shared_ptr()) {
        if(as_offset) {
          return std::string("Z");
        }
        else {
          return std::string("Coordinated Universal Time");
        }
    ...

There is similar if in zone_abbrev function...

And example usage of this

slimak@daradei:~/store/kodowanie/moje/test$ cat boost_date_time.cpp
#include "boost/date_time.hpp"
#include "boost/date_time/local_time/local_time.hpp"

using namespace boost::posix_time;
using namespace boost::local_time;

int main()
{
        local_date_time t = local_sec_clock::local_time(time_zone_ptr());
        local_time_facet* lf(new local_time_facet("%Y-%m-%dT%H:%M:%S%F%Q"));
        std::cout.imbue(std::locale(std::cout.getloc(), lf));
        std::cout << t << std::endl;
        return 0;
}
slimak@daradei:~/store/kodowanie/moje/test$ g++ boost_date_time.cpp && ./a.out
2009-01-30T12:15:56Z
slimak@daradei:~/store/kodowanie/moje/test$

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top