Pregunta

Quiero usar la biblioteca date_time en boost para representar el tiempo en mi aplicación. Esta aplicación generará feeds Atom, que a su vez exige marcas de tiempo en el formato especificado en RFC 3339 , por ejemplo & "; 1990-12-31T23: 59: 60Z &"; o " 1990-12-31T15: 59: 60-08: 00 " ;.

Entonces, ¿cómo formateo el tiempo de acuerdo con este RFC?

He estado leyendo el Date Time Input / Documentación de salida todo el día, y parece que no puedo encontrar cómo poner el Z al final cuando lo necesito. Además, el RFC admite un segundo fraccional opcional, pero solo un dígito (p. Ej. & Quot; 1990-12-31T23: 59: 60.5Z & Quot;) (*). Parece que tampoco puedo descubrir cómo hacer esto.

Siempre pude escribir mi propia rutina de formato que lee los diferentes campos necesarios, pero me parece que está trabajando en contra de la biblioteca <=>.

¿Alguna experiencia con la escritura de formateadores para esta biblioteca? ¿O estoy haciendo algo incorrecto?

(*): Me parece que el ABNF dado en el RFC solo permite segundos fraccionarios de un dígito, pero los ejemplos en el mismo RFC tienen segundos fraccionarios de dos dígitos. ¿Qué se supone que significa eso?

¿Fue útil?

Solución

  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$

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top