سؤال

أريد استخدام date_time مكتبة في دفعة لتمثيل الوقت في طلبي.سيقوم هذا التطبيق بإنشاء خلاصات Atom، والتي بدورها تتطلب طوابع زمنية بالتنسيق المحدد في آر إف سي 3339, ، على سبيل المثال "1990-12-31T23:59:60Z" أو "1990-12-31T15:59:60-08:00".

إذًا، كيف يمكنني تنسيق الوقت وفقًا لـ RFC هذا؟

لقد كنت أقرأ التاريخ الوقت وثائق الإدخال/الإخراج طوال اليوم، ويبدو أنني لا أستطيع معرفة كيفية وضع حرف Z في النهاية عندما أحتاج إليه.أيضًا، يدعم RFC ثانية كسرية اختيارية، ولكن مكونة من رقم واحد فقط (على سبيل المثال."31-12-1990T23:59:60.5Z") (*).لا يبدو أنني أعرف كيفية القيام بذلك أيضًا.

يمكنني دائمًا كتابة روتين التنسيق الخاص بي الذي يقرأ الحقول المختلفة المطلوبة، ولكن يبدو لي أن هذا يعمل ضد اتجاه التيار date_time مكتبة.

هل لديك أي خبرة في كتابة التنسيقات لهذه المكتبة؟أم أنني أفعل الشيء الخطأ؟

(*):يبدو لي أن ABNF الوارد في RFC يسمح فقط بالثواني الكسرية المكونة من رقم واحد، ولكن الأمثلة الموجودة في نفس RFC تحتوي على ثواني كسرية مكونة من رقمين.ما الذي يفترض أن يعني؟

هل كانت مفيدة؟

المحلول

  1. يقول ABNF من RFC أنه يجب أن يكون هناك رقم واحد على الأقل بعد النقطة، ولا يوجد حد أقصى محدد.

  2. ليست هناك حاجة حقيقية لـ Z، يمكنك استخدام 00:00 بدلاً من ذلك، وهذا ممكن مع الأوجه

  3. في بعض الحالات النادرة، سينشئ date_time الحرف "Z".راجع لقطة التعليمات البرمجية من Boost (local_date_time.hpp) التي تشير إلى أن هذا أدناه:


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

يوجد شيء مشابه إذا كان في وظيفة Zone_abbrev ...

ومثال على استخدام هذا

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$

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top