Howto formatar um boost :: date_time-objeto como por RFC 3339
-
20-08-2019 - |
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?
Solução
-
ABNF do RFC diz que deve haver pelo menos um dígito após o ponto, não há nenhum máximo definido.
-
Não há nenhuma necessidade real para o Z, você pode usar 0:00 em vez disso, e isso é possível com facetas
-
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$