2010-04-28 10 views
5

RFC1123 चीजों की एक संख्या को परिभाषित करता है से एक RFC1123 दिनांक स्ट्रिंग उत्पन्न कर सकते हैं, उन के बीच में, खजूर के प्रारूप इंटरनेट प्रोटोकॉल में इस्तेमाल किया जाएगा। HTTP (RFC2616) निर्दिष्ट करता है कि दिनांक प्रारूप RFC1123 के अनुरूप अनुरूप होना चाहिए।मैं कैसे सी कोड (Win32)

यह इस तरह दिखता है:

Date: Wed, 28 Apr 2010 02:31:05 GMT 

मैं सी संहिता से RFC1123 समय स्ट्रिंग कैसे उत्पन्न कर सकते हैं, विंडोज पर चल रहा है? मैं सी # और DateTime.ToString() का उपयोग नहीं है।

मैं जानता हूँ कि मैं समय-क्षेत्र और दिन-रूपों का उत्सर्जन करने, कोड अपने आप को लिख सकता है, लेकिन मैं आशा करती हूं कि यह पहले से ही Windows API में मौजूद है।

धन्यवाद।

उत्तर

9

यह मैं क्या उपयोग किया जाता है:

static const char *DAY_NAMES[] = 
    { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; 
static const char *MONTH_NAMES[] = 
    { "Jan", "Feb", "Mar", "Apr", "May", "Jun", 
    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; 

char *Rfc1123_DateTimeNow() 
{ 
    const int RFC1123_TIME_LEN = 29; 
    time_t t; 
    struct tm tm; 
    char * buf = malloc(RFC1123_TIME_LEN+1); 

    time(&t); 
    gmtime_s(&tm, &t); 

    strftime(buf, RFC1123_TIME_LEN+1, "---, %d --- %Y %H:%M:%S GMT", &tm); 
    memcpy(buf, DAY_NAMES[tm.tm_wday], 3); 
    memcpy(buf+8, MONTH_NAMES[tm.tm_mon], 3); 

    return buf; 
} 
1

यह untested है, लेकिन काफी करीब होना चाहिए:

time_t t = time(NULL); 
struct tm *my_tm = gmtime(&t); 
strftime(buffer, buf_size, "%a, %d %b %Y %H:%M:%S GMT", my_tm); 
puts(buffer); 
+1

ध्यान दें कि '% a' और '% b' यहां लोकेल पर निर्भर करता है, इसलिए यह शीर्ष पर समाधान के रूप में मजबूत नहीं है। – minghan

2

शायद, InternetTimeFromSystemTime WinInet एपीआई से।

RFC प्रारूप का इस्तेमाल किया। वर्तमान में, केवल मान्य स्वरूप INTERNET_RFC1123_FORMAT है।

+0

धन्यवाद। यह बिल्कुल बात है। लेकिन, क्या आप जानते हैं - क्या मुझे सर्वर अनुप्रयोग से wininet.dll का उपयोग करने के बारे में कोई चिंता होनी चाहिए? क्या यह कभी ऐसा मामला होगा कि wininet.dll मौजूद नहीं है? उदाहरण के लिए, यदि किसी सर्वर पर कोई आईई स्थापित नहीं है, तो wininet.dll गायब हो जाएगा? – Cheeso

+0

चीसो, हाँ, आपको wininet.dll की आवश्यकता है, लेकिन यह विंडोज का हिस्सा होना चाहिए। यदि आप पहले से ही अपना खुद का कार्यान्वयन करते हैं, तो हो सकता है कि आपको इसका उपयोग करने की आवश्यकता न हो। – YOU

1

अधिक सामान्यीकृत उदाहरण

std::string rfc1123_datetime(time_t time) 
{ 
    struct tm * timeinfo; 
    char buffer [80]; 

    timeinfo = gmtime (&time); 
    strftime (buffer,80,"%a, %d %b %Y %H:%M:%S GMT",timeinfo); 

    return buffer; 
} 
0

मैं इस प्रयोग किया है:

char wd[4], mo[4], dn[3], tm[9], yr[5]; 
time_t now; 

time(&now); 
sscanf(ctime(&now), "%s %s %s %s %s", wd, mo, dn, tm, yr); 
sprintf((char*) http_response, "\r\nDate: %s, %s %s %s %s GMTr\n\r\n", wd, dn, mo, yr, tm); 

वास्तव में मैं ctime_r धागे की सुरक्षा के लिए फोन का इस्तेमाल किया , लेकिन यह किसी भी तरह से काम करता है ...