[Raw Msg Headers][Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: autoconfig, and timezones ?



Matti Aarnio <mea@nic.funet.fi>
> Hello,
> 
> 	Anybody with good tips at how to handle the timezones with
> 	autoconfig ?   That thing is extremely varied :-(

libc usually gets it right, so:

const char* rfctime( void ) {
    static char date[128];
    const char * months[] = { "Jan", "Feb", "Mar", "Apr",
	"May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
    const char * days[] = { "Sun", "Mon", "Tue", "Wed",
	"Thu", "Fri", "Sat" };
    time_t now;
    struct tm gmt;
    struct tm local;
    struct tm conv;
    signed int diff;

    now = time(0);
    gmt   = *(gmtime(&now));
    local = *(localtime(&now));
    conv  = *(localtime(&now));

    /* if GMT were local, what would it be? */
    conv.tm_year = gmt.tm_year;
    conv.tm_mon  = gmt.tm_mon;
    conv.tm_mday = gmt.tm_mday;
    conv.tm_hour = gmt.tm_hour;
    conv.tm_min  = gmt.tm_min;
    conv.tm_sec  = gmt.tm_sec;
    conv.tm_wday = gmt.tm_wday;
    conv.tm_yday = gmt.tm_yday;

    /* see how far the real local is from GMT-as-local */
    /* should convert to signed int from double properly */
    diff = ((int)mktime(&local) - (int)mktime(&conv))/ 60;

    sprintf(date, "%3s, %d %3s %4d %02d:%02d:%02d %03+d%02d",
	    days[local.tm_wday], local.tm_mday, months[local.tm_mon],
	    local.tm_year+1900, local.tm_hour, local.tm_min, local.tm_sec, 
	    diff/60, diff%60);

    return (date);
}

--Arnt