OSXでRFC2822をフォーマットする

HTTPの日付文字列はあまり使われていないRFC2822になっている。探すとNSDateFormatterを使ったコードがけっこう出てくるけどこのクラスはちゃんと設定されているロケールに応じた日付文字列を返すのでシステムが日本語に設定してあると曜日が日本語で出力されてRFC2822にならない。書いた方が早い。

NSString* rfc2822StringFromDate(const NSDate* date) {
    time_t t;
    struct tm tm;
    time_t epoch = (time_t)[[NSDate date] timeIntervalSince1970];
    time(&epoch);
    gmtime_r(&epoch, &tm);
    static const char* month_names[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
    static const char* day_names[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
    return [NSString stringWithFormat:@"%s, %02d %s %4d %02d:%02d:%02d GMT",
        day_names[tm.tm_wday],
        tm.tm_mday,
        month_names[tm.tm_mon],
        tm.tm_year + 1900,
        tm.tm_hour,
        tm.tm_min,
        tm.tm_sec
    ];
}

About this entry