Frage

Ich mag die date_time Bibliothek im Boost verwenden, um Zeit in meiner Anwendung darstellen. Diese Anwendung wird Atom erzeugen Feeds, die wiederum beauftragt Zeitstempel im Format in RFC rel="nofollow 3339 , zum Beispiel "1990-12-31T23: 59: 60Z" oder "1990-12-31T15: 59: 60-08: 00"

.

So, wie formatiere ich Zeit nach diesem RFC?

Ich habe gelesen, die Datum Zeit Input / Output Dokumentation den ganzen Tag, und ich kann nicht scheinen, um herauszufinden, wie die Z am Ende zu setzen, wenn ich es brauche. Auch unterstützt die RFC eine optionale fraktionierte Sekunde, aber nur eine Stelle davon (z. B. "1990-12-31T23: 59: 60.5Z") (*). Ich kann nicht scheinen, um herauszufinden, wie diese entweder zu tun.

Ich konnte immer meine eigene Formatierung Routine schreiben, die die verschiedenen benötigten Felder liest, aber das scheint mir gegen den Strich der date_time Bibliothek zu arbeiten.

Jede Erfahrung mit dem Schreiben Formatierer für diese Bibliothek? Oder bin ich das Falsche zu tun?

(*): Es scheint mir, dass der ABNF in der RFC gegeben nur eine einstelligen Sekundenbruchteil erlaubt, aber die Beispiele in der gleichen RFC haben zweistellige Sekundenbruchteile. Was soll das bedeuten?

War es hilfreich?

Lösung

  1. ABNF von RFC sagt, dass es mindestens eine Ziffer nach Punkt sein muss, gibt es keine definierte Maximum.

  2. Es gibt keine wirkliche Notwendigkeit für die Z, können Sie 00.00 stattdessen verwenden, und dies ist möglich mit Facetten

  3. In einigen seltenen Fällen date_time ein "Z" erzeugen. Siehe Code Schnappschuss von Boost (local_date_time.hpp), die dies legt nahe, ist unten:


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

Es ist ähnlich, wenn in zone_abbrev Funktion ...

Und Beispiel für die Verwendung dieses

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$

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top