2010-04-28 7 views
5

RFC1123 definiuje wiele rzeczy, w tym format dat, które będą używane w protokołach internetowych. HTTP (RFC2616) określa, że ​​formaty daty muszą być generowane zgodnie z RFC1123.Jak wygenerować ciąg daty RFC1123, z kodu C (Win32)

Wygląda to tak:

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

Jak mogę wygenerować czas ciąg RFC1123 z kodu C, działa na Windows? Nie używam C# i DateTime.ToString().

Wiem, że sam mógłbym napisać kod, emitować strefy czasowe i skróty dzienne, ale mam nadzieję, że już istnieje w Windows API.

Dzięki.

Odpowiedz

9

To co kiedyś:

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

To niesprawdzone, ale powinien być dość blisko:

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

Należy zauważyć, że "% a" i "% b" tutaj zależy od ustawień narodowych, więc nie jest tak solidny, jak rozwiązanie na górze. – minghan

2

Prawdopodobnie InternetTimeFromSystemTime z Wininet API.

Używany format RFC. Obecnie jedynym ważnym formatem jest INTERNET_RFC1123_FORMAT.

+0

Dziękuję. To jest dokładnie to. Ale czy wiesz - czy powinienem mieć jakieś obawy dotyczące użycia wininet.dll z aplikacji serwera? Czy kiedykolwiek stanie się tak, że wininet.dll nie jest obecny? Na przykład, jeśli żaden IE nie jest zainstalowany na serwerze, nie będzie wininet.dll brakuje? – Cheeso

+0

Cheeso, tak, potrzebujesz wininet.dll, ale powinno być częścią systemu Windows. Jeśli już wdrożyłeś własne, może nie musisz tego używać. – YOU

1

Więcej uogólniony przykład

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

użyłem to:

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); 

rzeczywiście użyłem ctime_r zadzwonić być bezpieczny wątku , ale działa tak czy inaczej ...

Powiązane problemy