/* This function always closes the time with a zero byte, so it needs a * 13 character long buffer to store time in format "hh:mm:ss.fff" */ char * hb_timeStr( char * szTime, long lMilliSec ) { int iHour, iMinutes, iSeconds, iMSec; HB_TRACE( HB_TR_DEBUG, ( "hb_timeStr(%p, %ld)", szTime, lMilliSec ) ); hb_timeDecode( lMilliSec, &iHour, &iMinutes, &iSeconds, &iMSec ); hb_snprintf( szTime, 13, "%02d:%02d:%02d.%03d", iHour, iMinutes, iSeconds, iMSec ); return szTime; }
void hb_timeStampUnpack( double dTimeStamp, int * piYear, int * piMonth, int * piDay, int * piHour, int * piMinutes, int * piSeconds, int * piMSec ) { long lJulian, lMilliSec; HB_TRACE( HB_TR_DEBUG, ( "hb_timeStampUnpack(%f, %p, %p, %p, %p, %p, %p, %p)", dTimeStamp, piYear, piMonth, piDay, piHour, piMinutes, piSeconds, piMSec ) ); hb_timeStampUnpackDT( dTimeStamp, &lJulian, &lMilliSec ); hb_dateDecode( lJulian, piYear, piMonth, piDay ); hb_timeDecode( lMilliSec, piHour, piMinutes, piSeconds, piMSec ); }
/* This function always closes the time with a zero byte. * It needs a 24 character long buffer for full datetime representation * "YYYY-MM-DD hh:mm:ss.fff" */ char * hb_timeStampStr( char * szDateTime, long lJulian, long lMilliSec ) { int iYear, iMonth, iDay, iHour, iMinutes, iSeconds, iMSec; HB_TRACE( HB_TR_DEBUG, ( "hb_timeStampStr(%p, %ld, %ld)", szDateTime, lJulian, lMilliSec ) ); hb_dateDecode( lJulian, &iYear, &iMonth, &iDay ); hb_timeDecode( lMilliSec, &iHour, &iMinutes, &iSeconds, &iMSec ); hb_snprintf( szDateTime, 24, "%04d-%02d-%02d %02d:%02d:%02d.%03d", iYear, iMonth, iDay, iHour, iMinutes, iSeconds, iMSec ); szDateTime[ 23 ] = '\0'; return szDateTime; }
/* This function always closes the time with a zero byte, so it needs a * 18 character long buffer to store time in format "YYYYMMDDhhmmssfff" * with trailing 0 byte. */ char * hb_timeStampStrRawPut( char * szDateTime, long lJulian, long lMilliSec ) { int iYear, iMonth, iDay, iHour, iMinutes, iSeconds, iMSec; HB_TRACE( HB_TR_DEBUG, ( "hb_timeStampStrRawPut(%p, %ld, %ld)", szDateTime, lJulian, lMilliSec ) ); hb_dateDecode( lJulian, &iYear, &iMonth, &iDay ); hb_dateStrPut( szDateTime, iYear, iMonth, iDay ); hb_timeDecode( lMilliSec, &iHour, &iMinutes, &iSeconds, &iMSec ); hb_snprintf( szDateTime + 8, 10, "%02d%02d%02d%03d", iHour, iMinutes, iSeconds, iMSec ); return szDateTime; }
void hb_timeStampUnpackD( double dTimeStamp, int * piYear, int * piMonth, int * piDay, int * piHour, int * piMinutes, double * pdSeconds ) { long lJulian, lMilliSec; int iSeconds, iMSec; HB_TRACE( HB_TR_DEBUG, ( "hb_timeStampUnpackD(%f, %p, %p, %p, %p, %p, %p)", dTimeStamp, piYear, piMonth, piDay, piHour, piMinutes, pdSeconds ) ); hb_timeStampUnpackDT( dTimeStamp, &lJulian, &lMilliSec ); hb_dateDecode( lJulian, piYear, piMonth, piDay ); hb_timeDecode( lMilliSec, piHour, piMinutes, &iSeconds, &iMSec ); if( pdSeconds ) *pdSeconds = ( double ) iSeconds + ( double ) iMSec / 1000; }
/* time modifiers: * H - hour * M - minutes * S - seconds * F - fractional part of seconds * P - PM/AM marker * maximal size of time pattern: * 16 for "hh:mm:ss:ffff pp" * always safe buffer size is 17 (+1 for 0) */ char * hb_timeFormat( char * szBuffer, const char * szTimeFormat, long lMilliSec ) { char * szTimeBuffer; int iHour, iMinutes, iSeconds, iMSec, iPM, i12; int size, i, value, digits, skip; HB_TRACE( HB_TR_DEBUG, ( "hb_timeFormat(%p, %s, %ld)", szBuffer, szTimeFormat, lMilliSec ) ); hb_timeDecode( lMilliSec, &iHour, &iMinutes, &iSeconds, &iMSec ); szTimeBuffer = szBuffer; size = ( int ) hb_strnlen( szTimeFormat, 16 ); iPM = i12 = 0; for( i = 0; i < size; ++i ) { if( HB_TOUPPER( szTimeFormat[ i ] ) == 'P' ) { if( iHour >= 12 ) { iPM = 1; iHour -= 12; } if( iHour == 0 ) iHour += 12; if( iHour < 10 ) i12 = 1; break; } } i = 0; while( i < size ) { int count = -i; int ch = HB_TOUPPER( szTimeFormat[ i ] ); ++i; while( ch == HB_TOUPPER( szTimeFormat[ i ] ) && i < size ) ++i; count += i; switch( ch ) { case 'H': value = iHour; if( count == 2 && value >= 0 ) { if( i12 ) { *szTimeBuffer++ = ' '; --count; } digits = count; } else digits = 1; iHour = -1; break; case 'M': value = iMinutes; iMinutes = -1; digits = count > 2 ? 1 : count; break; case 'S': value = iSeconds; iSeconds = -1; digits = count > 2 ? 1 : count; break; case 'F': value = iMSec; iMSec = -1; digits = count > 4 ? 1 : count; switch( digits ) { case 4: value *= 10; break; case 2: value = ( value + 5 ) / 10; break; case 1: value = ( value + 50 ) / 100; break; } break; case 'P': if( iPM >= 0 ) { *szTimeBuffer++ = iPM ? 'P' : 'A'; if( --count ) { *szTimeBuffer++ = 'M'; --count; } iPM = -1; } default: digits = value = 0; } if( digits && value >= 0 ) { skip = digits; count -= digits; do { szTimeBuffer[ --digits ] = ( char ) ( '0' + value % 10 ); value /= 10; } while( digits ); szTimeBuffer += skip; } while( count-- ) *szTimeBuffer++ = ( char ) ch; } *szTimeBuffer = '\0'; return szBuffer; }