Pergunta

Eu quero usar a biblioteca date_time no impulso para representar o tempo em meu aplicativo. Esta aplicação vai gerar feeds Atom, que em mandatos turno time-stamps no formato especificado no RFC 3339 , por exemplo "1990-12-31T23: 59: 60Z" ou "1990-12-31T15: 59: 60-08: 00".

Então, como tempo formato I de acordo com este RFC?

Eu tenho lido a Input Data Tempo / documentação de saída durante todo o dia, e eu não consigo descobrir como colocar o Z no final, quando eu precisar. Além disso, o RFC suporta um segundo fraccionada opcional, mas apenas um dígito do mesmo (por exemplo. "1990-12-31T23: 59: 60.5Z") (*). Eu não consigo descobrir como fazer isso.

Eu sempre poderia escrever a minha própria rotina de formatação que lê os diferentes campos necessários, mas que me parece estar trabalhando contra o grão da biblioteca date_time.

Qualquer experiência com a escrita formatadores para esta biblioteca? Ou eu estou fazendo a coisa errada?

(*): Parece-me que o ABNF dada na RFC permite apenas um dígito fracionários segundos, mas os exemplos na mesma RFC têm de dois dígitos fracionários segundos. O que é que isso quer dizer?

Foi útil?

Solução

  1. ABNF do RFC diz que deve haver pelo menos um dígito após o ponto, não há nenhum máximo definido.

  2. Não há nenhuma necessidade real para o Z, você pode usar 0:00 em vez disso, e isso é possível com facetas

  3. Em algumas circunstâncias raras date_time irá gerar um "Z". Veja instantâneo código de impulso (local_date_time.hpp) que sugere que este é abaixo:


    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");
        }
    ...

Não é semelhante se em função zone_abbrev ...

E exemplo de uso deste

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top