2010-05-15 8 views
5

मैं HTTP प्रॉक्सी का एक प्रकार लिख रहा हूँ बनाने के लिए बढ़ावा देने, तो मैं 3 काम करने के लिए सक्षम होना चाहिए:उपयोग DATE_TIME पार्स और HTTP-दिनांकों

  1. एक HTTP की तारीख 3 के किसी भी पार्स प्रारूप RFC 2616, sec 3.3,
  2. फ़ाइल दिनांक-समय को HTTP-दिनांक स्ट्रिंग में कनवर्ट करें, और
  3. स्ट्रिंग की तारीख आउटपुट करें।

संदर्भ के लिए, इस समय के उदाहरण हैं जो मुझे पार्स करने की आवश्यकता है। मैं उत्पादन केवल प्रथम प्रारूप होगा:

Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 
    Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 
    Sun Nov 6 08:49:37 1994  ; ANSI C's asctime() format 

मैं यकीन है कि बूस्ट DATE_TIME कर रहा हूँ यह सब कर सकते हैं, लेकिन मैं नंबर 1. के साथ कुछ परेशानी किसी को पहले से ही यह करने के लिए कोड है आ रही है? शायद मैं कुशलता से Google का उपयोग नहीं कर रहा हूं, लेकिन मुझे कहीं भी बढ़ावा देने के साथ ऐसा करने का उदाहरण नहीं मिल रहा है।

किसी भी मदद के लिए धन्यवाद!

अद्यतन: मेरे पास एक समाधान है, लेकिन दूसरा पार्सर गलत वर्ष है (मुझे लगता है क्योंकि यह 2 अंकों का वर्ष है) और अंतिम पार्सर एक अपवाद देता है (नीचे आउटपुट देखें)।

try 
{ 
    // output time now in GMT 
    // format we want: Sun, 06 Nov 1994 08:49:37 GMT 
    boost::local_time::local_date_time t(boost::local_time::local_sec_clock::local_time(boost::local_time::time_zone_ptr())); 
    boost::local_time::local_time_facet* lf(new boost::local_time::local_time_facet("%a, %d %b %Y %H:%M:%S GMT")); 
    std::cout.imbue(std::locale(std::cout.getloc(), lf)); 
    std::cout << t << std::endl; 

    // get a file mod time into the correct format 
    boost::filesystem::path p("../code/main.cpp"); 
    boost::posix_time::ptime pt = boost::posix_time::from_time_t(
    boost::filesystem::last_write_time(p)); 
    boost::local_time::local_date_time t2(pt, boost::local_time::time_zone_ptr()); 
    std::cout << t2 << std::endl; 

    std::stringstream ss; 
    ss.exceptions(std::ios_base::failbit); 

    // input date-time 
    boost::local_time::local_time_input_facet* lif1(new boost::local_time::local_time_input_facet("%a, %d %b %Y %H:%M:%S GMT")); 
    ss.imbue(std::locale(std::locale::classic(), lif1)); 
    ss.str("Sun, 06 Nov 1994 08:49:37 GMT"); 
    ss >> t; 
    std::cout << t << std::endl; 

    boost::local_time::local_time_input_facet* lif2(new boost::local_time::local_time_input_facet("%A, %d-%b-%y %H:%M:%S GMT")); 
    ss.imbue(std::locale(std::locale::classic(), lif2)); 
    ss.str("Sunday, 06-Nov-94 08:49:37 GMT"); 
    ss >> t; 
    std::cout << t << std::endl; 

    boost::local_time::local_time_input_facet* lif3(new boost::local_time::local_time_input_facet("%a %b %e %H:%M:%S %Y")); 
    ss.imbue(std::locale(std::locale::classic(), lif3)); 
    ss.str("Sun Nov 6 08:49:37 1994"); 
    ss >> t; 
    std::cout << t << std::endl; 
} 
catch (std::exception& e) 
{ 
    std::cout << "Exception: " << e.what() << std::endl; 
} 

आउटपुट:

Sat, 15 May 2010 03:01:13 GMT 
Sat, 15 May 2010 03:01:01 GMT 
Sun, 06 Nov 1994 08:49:37 GMT 
Sat, 06 Nov 2094 08:49:37 GMT 
Exception: Parse failed. No match found for '' 
+1

आपको हमेशा अपने कोड के शीर्ष पर शीर्षलेख शामिल करना चाहिए। ऐसा इसलिए है कि लोग आपका कोड उठा सकते हैं और इसे संकलित कर सकते हैं। –

उत्तर

4

यहाँ दिनांक समय वर्ग मुझे लगता है कि करता है कि मैं क्या जरूरत पैदा करते हैं। शायद कोई और इसका इस्तेमाल करेगा। सार्वजनिक कोड में यह कोड। मैं किसी भी टिप्पणी का स्वागत करता हूँ।

वैसे, स्पष्ट रूप से std :: locale एक पहलू के लिए एक सूचक लेता है और उसके साथ इसे हटाए जाने पर इसे हटा देता है, इसलिए इसे हटाने की कोई आवश्यकता नहीं है (वास्तव में, इसे चीजों को तोड़ने)।

datetime.h:

// $Id$ 

#ifndef _DATETIME_H_ 
#define _DATETIME_H_ 

#include <string> 
#include "common.h" 
#include <boost/date_time/local_time/local_time.hpp> 

class DateTime 
{ 
public: 
    DateTime(); 
    DateTime(const std::string& path); 

    // return datetime string 
    std::string str(); 

    // update datetime from file mod date 
    std::string from_file(const std::string& path); 

    // parse datetime string 
    void parse(const std::string& dt); 

    // boolean equal operator 
    friend bool operator==(const DateTime& left, const DateTime& right); 

private: 
    boost::local_time::local_date_time m_dt; 
}; 

#endif // _DATETIME_H_ 

datetime.cpp:

// $Id$ 

#include <sstream> 
#include "common.h" 
#include <boost/date_time.hpp> 
#include <boost/date_time/local_time/local_time.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/filesystem/operations.hpp> 
#include "datetime.h" 

DateTime::DateTime() 
:m_dt(boost::local_time::local_sec_clock::local_time(boost::local_time::time_zone_ptr())) 
{ 
} 

DateTime::DateTime(const std::string& path) 
:m_dt(boost::local_time::local_sec_clock::local_time(boost::local_time::time_zone_ptr())) 
{ 
    from_file(path); 
} 

std::string DateTime::str() 
{ 
    std::string result; 
    boost::local_time::local_time_facet* lf(new boost::local_time::local_time_facet("%a, %d %b %Y %H:%M:%S GMT")); 
    try 
    { 
    std::stringstream ss; 
    ss.imbue(std::locale(ss.getloc(), lf)); 
    ss << m_dt; 
    result = ss.str(); 
    } 
    catch (std::exception& e) 
    { 
    std::cout << "Exception: " << e.what() << std::endl; 
    } 
    return result; 
} 

std::string DateTime::from_file(const std::string& path) 
{ 
    try 
    { 
    boost::filesystem::path p(path); 
    boost::posix_time::ptime pt = boost::posix_time::from_time_t(
     boost::filesystem::last_write_time(p)); 
    m_dt = boost::local_time::local_date_time(pt, boost::local_time::time_zone_ptr()); 
    } 
    catch (std::exception& e) 
    { 
    std::cout << "Exception: " << e.what() << std::endl; 
    } 
    return str(); 
} 

void DateTime::parse(const std::string& dt) 
{ 
    boost::local_time::local_time_input_facet* lif(new boost::local_time::local_time_input_facet("%a, %d %b %Y %H:%M:%S GMT")); 
    std::stringstream ss(dt); 
    ss.imbue(std::locale(std::locale::classic(), lif)); 
    ss >> m_dt; 
} 

bool operator==(const DateTime& left, const DateTime& right) 
{ 
    return (left.m_dt == right.m_dt); 
} 
6

मुझे नहीं लगता कि आपको लगता है कि अब तक जाने के लिए और बूस्ट :) आप प्राप्त कर सकते हैं के लिए तक पहुंचना चाहते हैं सरल सी कोड के साथ:

static const char format[] = "%a, %d %b %Y %H:%M:%S %Z"; // rfc 1123 
struct tm tm; 
bzero(&tm, sizeof(tm)); 
if (strptime(str, format, &tm)) {..} 
+3

-1: यह विंडोज पर काम नहीं करता है। time.h में 'strptime() 'नहीं है। इसके अलावा, बूस्ट के बजाय सी का उपयोग कर? मुझे वह पसंद नहीं है। –

संबंधित मुद्दे