/* 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); }
_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 ); }