Domanda

Voglio usare la libreria date_time in boost per rappresentare il tempo nella mia applicazione. Questa applicazione genererà feed Atom, che a loro volta impone timestamp nel formato specificato in RFC 3339 , ad esempio " 1990-12-31T23: 59: 60Z " oppure " 1990-12-31T15: 59: 60-08: 00 " ;.

Quindi, come posso formattare il tempo in base a questo RFC?

Ho letto Data Ora Input / Documentazione di output per tutto il giorno e non riesco a scoprire come mettere la Z alla fine quando ne ho bisogno. Inoltre, la RFC supporta un secondo frazionario opzionale, ma solo una cifra (es. & Quot; 1990-12-31T23: 59: 60.5Z & Quot;) (*). Non riesco nemmeno a scoprire come farlo.

Potrei sempre scrivere la mia routine di formattazione che legge i diversi campi necessari, ma mi sembra che stia lavorando contro il grano della <=> libreria.

Qualche esperienza con la scrittura di formattatori per questa libreria? O sto facendo la cosa sbagliata?

(*): Mi sembra che l'ABNF fornito nella RFC consenta solo secondi frazionari a una cifra, ma gli esempi nella stessa RFC hanno secondi frazionari a due cifre. Cosa dovrebbe significare?

È stato utile?

Soluzione

  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$

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top