Beispiel #1
0
/*          1         2         3         4         5         6         7
  01234567890123456789012345678901234567890123456789012345678901234567890123456789
  06/27/06 19:12:53
  12/31/69 19:00:00
  07/10/06 16:21:25
  12/31/69 19:00:00
  07/05/06 06:08:14
  07/05/06 06:08:14
*/
BOOL parse_os400_date_time(LPSTR& line, Time_t& decoded)
{
	if(!line[0] ||
	        line[2] != '/' || line[5] != '/' ||
	        line[8] != ' ' ||
	        line[11] != ':' || line[14] != ':')
		return FALSE;

	SYSTEMTIME st;
	GetSystemTime(&st);
	st.wMilliseconds = 0;
//mon
	TwoDigits(line, st.wMonth);

	if(st.wMonth == MAX_WORD)
		return FALSE;

	line += 3;
//mday
	TwoDigits(line, st.wDay);

	if(st.wDay == MAX_WORD)
		return FALSE;

	line += 3;
//year
	TwoDigits(line, st.wYear);

	if(st.wYear == MAX_WORD)
		return FALSE;

	if(st.wYear < 50)
		st.wYear += 100;

	st.wYear += 1900;
	line += 3;
//Time
	TwoDigits(line+0, st.wHour);
	TwoDigits(line+3, st.wMinute);
	TwoDigits(line+6, st.wSecond);

	if(st.wHour   == MAX_WORD ||
	        st.wMinute == MAX_WORD ||
	        st.wSecond == MAX_WORD)
		return FALSE;

	line += 8;
	st.wDayOfWeek = 0;
	return SystemTimeToFileTime(&st, decoded);
}
Beispiel #2
0
_WCRTLINK size_t __F_NAME(strftime,wcsftime)( CHAR_TYPE *s, size_t maxsize,
             const CHAR_TYPE *format, const struct tm *timeptr )
{
    CHAR_TYPE           buffer[TZNAME_MAX + 1];
    const char          *p;
    const CHAR_TYPE     *save_format;
    size_t              len;
    int                 hour;
    size_t              amt_left;
    size_t              piece;
#if defined( __WIDECHAR__ )
    CHAR_TYPE           tmp_fmt[30];
#endif
    int                 isoweek;
    int                 isoyear;
    int                 iso_wday_jan01;
    int                 iso_timezone;

    len = 0;
    amt_left = maxsize;
    save_format = NULL;
    for( ;; ) {
        p = (char *)buffer;
        if( *format == NULLCHAR ) {
            if( save_format == NULL )
                break;
            format = save_format + 1;
            save_format = NULL;
            continue;
        }
        if( *format != STRING( '%' ) ) {
            buffer[0] = *format;
            buffer[1] = NULLCHAR;
        } else {
            ++format;
            if( (*format == STRING( 'E' )) || (*format == STRING( 'O' )) ) {
                ++format;                      /* ignore E and O modifier */
                if( *format == NULLCHAR ) {    /* end of formatstring? */
                    break;
                }
            }
            switch( *format ) {
            case STRING( 'a' ):                         /* locale's abbreviated weekday name */
                p = awday_name + timeptr->tm_wday * 4;
                break;
            case STRING( 'A' ):                         /* locale's full weekday name */
                p = wday_name[timeptr->tm_wday];
                break;
            case STRING( 'b' ):                         /* locale's abbreviated month name */
            case STRING( 'h' ):
                p = amon_name + timeptr->tm_mon * 4;
                break;
            case STRING( 'B' ):                         /* locale's full month name */
                p = mon_name[timeptr->tm_mon];
                break;
            case STRING( 'c' ):                         /* locale's appropriate date & time representation*/
#if 0
                sprintf( buffer, "%.3s %.3s %.2d %.2d:%.2d:%.2d %d",
                          wday_name[timeptr->tm_wday],
                          mon_name[timeptr->tm_mon],
                          timeptr->tm_mday,
                          timeptr->tm_hour,
                          timeptr->tm_min,
                          timeptr->tm_sec,
                          1900 + timeptr->tm_year );
                break;
#else
                save_format = format;
                format = _AToUni( tmp_fmt, "%a %b %d %H:%M:%S %Y" );
                continue;
#endif
            case STRING( 'C' ):                         /* century  (00-99) */
                TwoDigits( buffer, ( timeptr->tm_year + 1900 ) / 100 );
                break;
            case STRING( 'd' ):                         /* day of the month (01-31) */
                TwoDigits( buffer, timeptr->tm_mday );
                break;
            case STRING( 'D' ):
#if 0
                sprintf( buffer, "%.2d/%.2d/%.2d",
                          timeptr->tm_mon + 1, /* added "+ 1" 23-sep-90 */
                          timeptr->tm_mday,
                          timeptr->tm_year % 100 );
                break;
#else
                save_format = format;
                format = _AToUni( tmp_fmt, "%m/%d/%y" );
                continue;
#endif
            case STRING( 'e' ):                         /* day of the month ( 1-31) */
                TwoDigits( buffer, timeptr->tm_mday );
                if( *buffer == STRING( '0' ) ) {
                    *buffer = STRING( ' ' );
                }
                break;
            case STRING( 'F' ):                         /* ISO 8601 date format  */
                save_format = format;
                format = _AToUni( tmp_fmt, "%Y-%m-%d" );
                continue;
            case STRING( 'g' ):                         /* ISO Week-based year   yy */
            case STRING( 'G' ):                         /* ISO Week-based year yyyy */
                iso_wday_jan01 = ( 8 + ( 6 + timeptr->tm_wday ) % 7 - timeptr->tm_yday % 7 ) % 7;
                if( iso_wday_jan01 == 0 ) {
                    iso_wday_jan01 = 7; /* 1=mon, ... 7=sun */
                }
                isoweek = ( 6 + timeptr->tm_yday - ( 6 + timeptr->tm_wday ) % 7 ) / 7 + ( 8 - iso_wday_jan01 ) / 4;
                if( isoweek == 0 ) {    /* belongs to previous year */
                    isoyear = timeptr->tm_year + 1899;
                } else {
                    if( (timeptr->tm_yday > 360) && (timeptr->tm_mday > 28) &&
                        (timeptr->tm_wday < 4) && timeptr->tm_wday &&
                        (31 - timeptr->tm_mday + timeptr->tm_wday < 4) ) {
                        isoyear = timeptr->tm_year + 1901;
                    } else {
                        isoyear = timeptr->tm_year + 1900;
                    }
                }
                if( *format == STRING( 'g' ) ) {
                    TwoDigits( buffer, isoyear % 100 );
                } else {
                    __F_NAME(itoa,_itow)( isoyear, buffer, 10 );
                }
                break;
            case STRING( 'H' ):                         /* hour (24-hour clock) (00-23) */
                TwoDigits( buffer, timeptr->tm_hour );
                break;
            case STRING( 'I' ):                         /* hour (12-hour clock) (00-12) */
                hour = timeptr->tm_hour;
                if( hour > 12 )
                    hour -= 12;
                if( hour == 0 )
                    hour = 12;
                TwoDigits( buffer, hour );
                break;
            case STRING( 'j' ):                         /* day of the year (001-366) */
                // sprintf( buffer, "%.3d", timeptr->tm_yday + 1 );
                __F_NAME(itoa,_itow)( timeptr->tm_yday + 101, buffer, 10 );
                buffer[0]--;
                // itoa( timeptr->tm_yday + 1001, buffer, 10 );
                // p = buffer + 1;     /* only want last 3 digits */
                break;
            case STRING( 'm' ):                         /* month (01-12) */
                TwoDigits( buffer, timeptr->tm_mon + 1 );
                break;
            case STRING( 'M' ):                         /* minute (00-59) */
                TwoDigits( buffer, timeptr->tm_min );
                break;
            case STRING( 'n' ):
                p = "\n";
                break;
            case STRING( 'p' ):                         /* locale's equivalent of either AM or PM */
                p = ( timeptr->tm_hour < 12 ) ? "AM" : "PM";
                break;
            case STRING( 'r' ):
#if 0
                hour = timeptr->tm_hour;
                if( hour > 12 )
                    hour -= 12;
                if( hour == 0 )
                    hour = 12;                 /* 24-sep-90 */
                sprintf( buffer, "%.2d:%.2d:%.2d PM", hour, timeptr->tm_min,
                          timeptr->tm_sec );
                if( timeptr->tm_hour < 12 )
                    buffer[9] = STRING( 'A' );
                break;
#else
                save_format = format;
                format = _AToUni( tmp_fmt, "%I:%M:%S %p" );
                continue;
#endif
            case STRING( 'R' ):   /* hour (24-hour clock) (00-23) : minute (00-59) */
                save_format = format;
                format = _AToUni( tmp_fmt, "%H:%M" );
                continue;
            case STRING( 'S' ):   /* second (00-60) */
                TwoDigits( buffer, timeptr->tm_sec );
                break;
            case STRING( 't' ):
                p = "\t";
                break;
            case STRING( 'u' ):                         /* ISO weekday (1-7) Monday = 1,  Sunday = 7 */
                buffer[0] = timeptr->tm_wday ? timeptr->tm_wday + STRING( '0' ) : STRING( '7' );
                buffer[1] = NULLCHAR;
                break;
            case STRING( 'U' ):   /* week number of the year (00-53) Sun first day */
                TwoDigits( buffer, ( timeptr->tm_yday + 7 - timeptr->tm_wday ) / 7 );
                break;
            case STRING( 'V' ):                         /* ISO week number Week 1 includes Jan 4th */
                iso_wday_jan01 = ( 8 + ( 6 + timeptr->tm_wday ) % 7 - timeptr->tm_yday % 7 ) % 7;
                if( iso_wday_jan01 == 0 ) {
                    iso_wday_jan01 = 7; /* 1=mon, ... 7=sun */
                }
                isoweek = ( 6 + timeptr->tm_yday - ( 6 + timeptr->tm_wday ) % 7 ) / 7 + ( 8 - iso_wday_jan01 ) / 4;
                if( isoweek == 0 ) {    /* belongs to last week of previous year */

                    /* if isoweek is zero, date is Jan 1 to 3, and weekday is Fri to Sun */
                    /* calculate last week number of previous year ( 52 or 53 ) */

                    if( (iso_wday_jan01 == 7) ||
                        ( (iso_wday_jan01 == 6 ) && !__leapyear( (unsigned)timeptr->tm_year + 1899 ) ) ) {
                        isoweek= 52; /* if dec 31 is sat, week 52 */
                                     /* if dec 31 is fri, week 52 if no leapyear */
                    } else {
                        isoweek = 53;
                    }
                } else {
                    if( (timeptr->tm_yday > 360) && (timeptr->tm_mday > 28) &&
                        (timeptr->tm_wday < 4) && timeptr->tm_wday &&
                        (31 - timeptr->tm_mday + timeptr->tm_wday < 4) ) {
                        isoweek = 1;                     /* belongs to next year */
                    }
                }
                TwoDigits( buffer, isoweek );
                break;
            case STRING( 'w' ):   /* weekday (0-6) Sunday=0 */
                buffer[0] = timeptr->tm_wday + STRING( '0' );
                buffer[1] = NULLCHAR;
                break;
            case STRING( 'W' ):  /* week number of the year (00-53) Mon first day */
                TwoDigits( buffer, ( timeptr->tm_yday + 7 - ( timeptr->tm_wday + 6 ) % 7 ) / 7 );
                break;
            case STRING( 'x' ):   /* locale's appropriate date representation */
#if 0
                sprintf( buffer, "%.3s %.3s %.2d, %d",
                          awday_name + timeptr->tm_wday * 4,
                          amon_name + timeptr->tm_mon * 4,
                          timeptr->tm_mday,
                          1900 + timeptr->tm_year );
                break;
#else
                save_format = format;
                format = _AToUni( tmp_fmt, "%a %b %d, %Y" );
                continue;
#endif
            case STRING( 'X' ):   /* locale's appropriate time representation */
            case STRING( 'T' ):
#if 0
                sprintf( buffer, "%.2d:%.2d:%.2d",
                          timeptr->tm_hour,
                          timeptr->tm_min,
                          timeptr->tm_sec );
                break;
#else
                save_format = format;
                format = _AToUni( tmp_fmt, "%H:%M:%S" );
                continue;
#endif
            case STRING( 'y' ):   /* year without the century (00-99) */
                TwoDigits( buffer, timeptr->tm_year % 100 );
                break;
            case STRING( 'Y' ):   /* year with century */
                __F_NAME(itoa,_itow)( timeptr->tm_year + 1900, buffer, 10 );
                break;
            case STRING( 'z' ):   /* timezone offset from UTC */
                /* OW  has TZ positive offsets for zones WEST of Greenwich,
                  ISO has positive offsets for zones EAST of Grenwich */
                tzset();          /* get time zone settings */
                if( timeptr->tm_isdst == -1 ) {
                    buffer[0] = NULLCHAR;        /* timezone unknown */
                } else {
                    iso_timezone = _RWD_timezone;
                    if( iso_timezone > 0 ) {
                        buffer[0] = STRING( '-' );
                    } else {
                        iso_timezone = - _RWD_timezone;
                        buffer[0] = STRING( '+' );
                    }
#if 0
                    /* what about DST ????? C99 standard does not mention it */
                    if( timeptr->tm_isdst > 0 ) {
                        iso_timezone += _RWD_dst_adjust;
                    }
#endif
                    TwoDigits( buffer + 1, iso_timezone / 3600 );        /* hours */
                    TwoDigits( buffer + 3, ( iso_timezone / 60 ) % 60 ); /* minutes */
                }
                break;
            case STRING( 'Z' ):   /* time zone name */
                tzset(); /* get time zone settings */
                p = _RWD_tzname[timeptr->tm_isdst];
                break;
            case STRING( '%' ):
            default  :
                buffer[0] = *format;
                buffer[1] = NULLCHAR;
                break;
            }
        }
#if defined( __WIDECHAR__ )
        if( p != (char *)buffer ) {
            /*** Convert the MBCS string to wide chars in buffer ***/
            if( mbstowcs( buffer, p, sizeof( buffer ) / sizeof( wchar_t ) ) == (size_t)-1 )
                buffer[0] = NULLCHAR;
            p = (const char *)buffer;
        }
#endif
        ++format;
        piece = __F_NAME(strlen,wcslen)( (const CHAR_TYPE *)p );
        if( piece > amt_left )
            piece = amt_left;
        memcpy( s + len, (const CHAR_TYPE *)p, piece * CHARSIZE );
        amt_left -= piece;
        len += piece;
    }
    if( len < maxsize ) {
        s[len] = NULLCHAR;
        return( len );
    }
    return( 0 );
}