Mail Archives: djgpp/2000/04/12/08:46:40
> I cannot reproduce the first problem.  Please always make a point of
Transcript with output and source code at end of this message.
Basically, the tm struct info says it's Standard Time (tm_isdst == 0)
when it should be Daylight Time.  If it *were* CST instead of CST,
then the __tm_zone and __tm_gmtoff would be correct, and the "%Z"
format would be correct also.  However, it looks like the "%z" format
is not looking at __tm_gmtoff to derive the correct "+/-hhmm" text.
> Is the value of the TZ environment variable set in DJGPP.ENV or in the
> environment?
Environment.
> In any case, %z is a non-ANSI format, and it isn't even documented in
> the DJGPP library reference.  So I wonder how did you come about using
> it.
It's documented at <http://www.delorie.com/gnu/docs/glibc/libc_302.html>,
although I actually found it in the strftime man page on RH Linux 6.1.
The fact that DJGPP displays "-0000" indicates at least it's known by the
code, just not using the correct offset.
> >   %a, %d %b %Y %H:%M:%S %Z --> Tue, 11 Apr 2000 09:50:47 CST
>
> I don't see any problem with this behavior.  If you think there is a
> problem, please explain what it is.
Wrong time zone (CST instead of CDT), although it's technically
correct based on the tm values.  I just displayed this to contrast
the "%Z" and "%z" results, where "%z" is wrong in both respects.
> Here's the test program I used:
And the transcript of my test (xrun.bat), source at end:
----- xrun.bat -----
set DJGPP=c:/djgpp/djgpp.env
set PATH=c:\djgpp\bin;%PATH%
echo %TZ%
gcc -v
gcc x.c -o x.exe
x
type x.c
exit
-----
C:\wrk\cwrk> xrun
C:\wrk\cwrk> set DJGPP=c:/djgpp/djgpp.env
C:\wrk\cwrk> set PATH=c:\djgpp\bin;%PATH%
C:\wrk\cwrk> echo %TZ%
CST6CDT
C:\wrk\cwrk> gcc -v
Reading specs from c:/djgpp/lib/gcc-lib/djgpp/2.952/specs
gcc version 2.95.2 19991024 (release)
C:\wrk\cwrk> gcc x.c -o x.exe
C:\wrk\cwrk> x
Dumping tm_ptr:
  tm_sec      = 36
  tm_min      = 21
  tm_hour     = 4
  tm_mday     = 12
  tm_mon      = 3
  tm_year     = 100
  tm_wday     = 3
  tm_yday     = 102
  tm_isdst    = 0 (** should be 1 **)
  __tm_zone   = CST (** should be CDT **)
  __tm_gmtoff = -21600 (** should be -18000 **)
Dumping tzname:
  tzname[0] = CST
  tzname[1] = CDT
asctime = Wed Apr 12 04:21:36 2000
strftime:
  %a, %d %b %Y %H:%M:%S %z --> Wed, 12 Apr 2000 04:21:36 -0000
(** should be -0500 **)
  %a, %d %b %Y %H:%M:%S %Z --> Wed, 12 Apr 2000 04:21:36 CST
(** should be CDT **)
C:\wrk\cwrk> type x.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define FMT1 "%a, %d %b %Y %H:%M:%S %z"
#define FMT2 "%a, %d %b %Y %H:%M:%S %Z"
main( int argc, char *argv[] ) {
    struct tm *tm_ptr;
    time_t tval;
    char ltime[100];
    char rtime1[100];
    char rtime2[100];
    tzset();
    time( &tval );
    tm_ptr = localtime( &tval );
    strncpy( ltime, asctime( tm_ptr ), 99 );
    strftime( rtime1, 99, FMT1, tm_ptr );
    strftime( rtime2, 99, FMT2, tm_ptr );
    printf( "\n" );
    printf( "Dumping tm_ptr:\n" );
    printf( "  tm_sec      = %d\n", tm_ptr->tm_sec );
    printf( "  tm_min      = %d\n", tm_ptr->tm_min );
    printf( "  tm_hour     = %d\n", tm_ptr->tm_hour );
    printf( "  tm_mday     = %d\n", tm_ptr->tm_mday );
    printf( "  tm_mon      = %d\n", tm_ptr->tm_mon );
    printf( "  tm_year     = %d\n", tm_ptr->tm_year );
    printf( "  tm_wday     = %d\n", tm_ptr->tm_wday );
    printf( "  tm_yday     = %d\n", tm_ptr->tm_yday );
    printf( "  tm_isdst    = %d (** should be 1 **)\n", tm_ptr->tm_isdst );
    printf( "  __tm_zone   = %s (** should be CDT **)\n", tm_ptr->__tm_zone );
    printf( "  __tm_gmtoff = %d (** should be -18000 **)\n", tm_ptr->__tm_gmtoff );
    printf( "\n" );
    printf( "Dumping tzname:\n" );
    printf( "  tzname[0] = %s\n", tzname[0] );
    printf( "  tzname[1] = %s\n", tzname[1] );
    printf( "\n" );
    printf( "asctime = %s\n", ltime );
    printf( "\n" );
    printf( "strftime:\n" );
    printf( "  %s --> %s\n(** should be -0500 **)\n", FMT1, rtime1 );
    printf( "  %s --> %s\n(** should be CDT **)\n", FMT2, rtime2 );
    printf( "\n" );
}
C:\wrk\cwrk> exit
-- 
- Raw text -