Как я могу сгенерировать строку даты RFC1123, из кода C (Win32) - PullRequest
5 голосов
/ 28 апреля 2010

RFC1123 определяет ряд вещей, в том числе формат дат для использования в интернет-протоколах. HTTP ( RFC2616 ) указывает, что форматы даты должны быть созданы в соответствии с RFC1123.

Это выглядит так:

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

Как я могу сгенерировать временную строку RFC1123 из кода C, работающего в Windows? У меня нет использования C # и DateTime.ToString ().

Я знаю, что мог бы сам написать код для создания часовых поясов и сокращений дня, но я надеюсь, что он уже существует в Windows API.

Спасибо.

Ответы [ 5 ]

9 голосов
/ 28 апреля 2010

Вот что я использовал:

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;
}
2 голосов
/ 28 апреля 2010

Возможно, InternetTimeFromSystemTime из Wininet API.

Используется формат RFC. В настоящее время единственным допустимый формат INTERNET_RFC1123_FORMAT.

2 голосов
/ 28 апреля 2010

Это не проверено, но должно быть достаточно близко:

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 голос
/ 18 июля 2012

Более обобщенный пример

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 голосов
/ 11 августа 2013

Я использовал это:

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 для обеспечения безопасности потока, но он работает в любом случае ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...