From 1411ce7f9c10289f3bc80ee8fc0d122bd1ad83d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Sat, 13 Dec 2025 19:38:15 +0100 Subject: [PATCH] 2025-12-13 19:38 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * include/hbdate.h * src/common/hbdate.c * changed the following C functions: HB_BOOL hb_timeStrGetUTC( const char * szTime, int * piHour, int * piMinutes, int * piSeconds, int * piMSec, int * piUTCOffset ); HB_BOOL hb_timeStampStrGetUTC( const char * szDateTime, int * piYear, int * piMonth, int * piDay, int * piHour, int * piMinutes, int * piSeconds, int * piMSec, int * piUTCOffset ); to HB_BOOL hb_timeStrGetUTC( const char * szTime, int * piHour, int * piMinutes, int * piSeconds, int * piMSec, int * piUTCOffset, HB_BOOL * pfUTC ); HB_BOOL hb_timeStampStrGetUTC( const char * szDateTime, int * piYear, int * piMonth, int * piDay, int * piHour, int * piMinutes, int * piSeconds, int * piMSec, int * piUTCOffset, HB_BOOL * pfUTC ); Warning: incompatibility !!! New parameter HB_BOOL * pfUTC has been added. These functions are used by Harbour internally but if someone uses them in his code then he should add NULL to passed parameters. + added new C function: HB_BOOL hb_timeStampStrGetDTU( const char * szDateTime, long * plJulian, long * plMilliSec, HB_BOOL * pfUTC ); ; the parameter pfUTC is used to retrieve information if time string represents UTC time. * src/rtl/dateshb.c * added 2-nd parameter to hb_StrToTS() function which can be passed by reference to retrieve information if time string represents UTC time. Current syntax is: hb_StrToTS( [, @ ] ) -> --- ChangeLog.txt | 42 +++++++++++++++++++++++++++++++++++++ include/hbdate.h | 8 +++++--- src/common/hbdate.c | 50 +++++++++++++++++++++++++++++++-------------- src/rtl/dateshb.c | 4 +++- 4 files changed, 85 insertions(+), 19 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index bb37da28dd..eca13c908c 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -7,6 +7,48 @@ Entries may not always be in chronological/commit order. See license at the end of file. */ +2025-12-13 19:38 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * include/hbdate.h + * src/common/hbdate.c + * changed the following C functions: + HB_BOOL hb_timeStrGetUTC( const char * szTime, + int * piHour, int * piMinutes, + int * piSeconds, + int * piMSec, int * piUTCOffset ); + HB_BOOL hb_timeStampStrGetUTC( const char * szDateTime, + int * piYear, int * piMonth, + int * piDay, int * piHour, + int * piMinutes, int * piSeconds, + int * piMSec, int * piUTCOffset ); + to + HB_BOOL hb_timeStrGetUTC( const char * szTime, + int * piHour, int * piMinutes, + int * piSeconds, + int * piMSec, int * piUTCOffset, + HB_BOOL * pfUTC ); + HB_BOOL hb_timeStampStrGetUTC( const char * szDateTime, + int * piYear, int * piMonth, + int * piDay, int * piHour, + int * piMinutes, int * piSeconds, + int * piMSec, int * piUTCOffset, + HB_BOOL * pfUTC ); + Warning: incompatibility !!! New parameter HB_BOOL * pfUTC has been + added. These functions are used by Harbour internally but + if someone uses them in his code then he should add NULL + to passed parameters. + + added new C function: + HB_BOOL hb_timeStampStrGetDTU( const char * szDateTime, + long * plJulian, long * plMilliSec, + HB_BOOL * pfUTC ); + ; the parameter pfUTC is used to retrieve information if time string + represents UTC time. + + * src/rtl/dateshb.c + * added 2-nd parameter to hb_StrToTS() function which can be passed by + reference to retrieve information if time string represents UTC time. + Current syntax is: + hb_StrToTS( [, @ ] ) -> + 2025-12-12 04:09 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * include/harbour.hbx * src/harbour.def diff --git a/include/hbdate.h b/include/hbdate.h index bfdc871eee..e1c46969e0 100644 --- a/include/hbdate.h +++ b/include/hbdate.h @@ -90,7 +90,7 @@ extern HB_EXPORT HB_BOOL hb_timeStrGet( const char * szTime, int * piSeconds, int * piMSec ); extern HB_EXPORT HB_BOOL hb_timeStrGetUTC( const char * szTime, int * piHour, int * piMinutes, int * piSeconds, - int * piMSec, int * piUTCOffset ); + int * piMSec, int * piUTCOffset, HB_BOOL * pfUTC ); extern HB_EXPORT void hb_timeStrRawGet( const char * szTime, int * piHour, int * piMinutes, int * piSeconds, int * piMSec ); @@ -119,9 +119,11 @@ extern HB_EXPORT HB_BOOL hb_timeStampStrGet( const char * szDateTime, extern HB_EXPORT HB_BOOL hb_timeStampStrGetUTC( const char * szDateTime, int * piYear, int * piMonth, int * piDay, int * piHour, int * piMinutes, int * piSeconds, - int * piMSec, int * piUTCOffset ); + int * piMSec, int * piUTCOffset, HB_BOOL * pfUTC ); extern HB_EXPORT HB_BOOL hb_timeStampStrGetDT( const char * szDateTime, - long * plJulian, long * plMilliSec ); + long * plJulian, long * plMilliSec ); +extern HB_EXPORT HB_BOOL hb_timeStampStrGetDTU( const char * szDateTime, + long * plJulian, long * plMilliSec, HB_BOOL * pfUTC ); extern HB_EXPORT double hb_timeStampPackDT( long lJulian, long lMilliSec ); extern HB_EXPORT void hb_timeStampUnpackDT( double dTimeStamp, diff --git a/src/common/hbdate.c b/src/common/hbdate.c index d0e60f1069..d67868a219 100644 --- a/src/common/hbdate.c +++ b/src/common/hbdate.c @@ -495,15 +495,16 @@ char * hb_timeStr( char * szTime, long lMilliSec ) HB_BOOL hb_timeStrGetUTC( const char * szTime, int * piHour, int * piMinutes, - int * piSeconds, int * piMSec, int * piUTCOffset ) + int * piSeconds, int * piMSec, + int * piUTCOffset, HB_BOOL * pfUTC ) { int iHour, iMinutes, iSeconds, iMSec, iUTCOffset, iBlocks; - HB_BOOL fValid; + HB_BOOL fValid, fUTC; - HB_TRACE( HB_TR_DEBUG, ( "hb_timeStrGetUTC(%s, %p, %p, %p, %p, %p)", szTime, ( void * ) piHour, ( void * ) piMinutes, ( void * ) piSeconds, ( void * ) piMSec, ( void * ) piUTCOffset ) ); + HB_TRACE( HB_TR_DEBUG, ( "hb_timeStrGetUTC(%s, %p, %p, %p, %p, %p, %p)", szTime, ( void * ) piHour, ( void * ) piMinutes, ( void * ) piSeconds, ( void * ) piMSec, ( void * ) piUTCOffset, ( void * ) pfUTC ) ); iHour = iMinutes = iSeconds = iMSec = iUTCOffset = iBlocks = 0; - fValid = HB_FALSE; + fValid = fUTC = HB_FALSE; if( szTime ) { @@ -549,7 +550,10 @@ HB_BOOL hb_timeStrGetUTC( const char * szTime, } } if( iBlocks > 0 && ( szTime[ 0 ] == 'Z' || szTime[ 0 ] == 'z' ) ) + { + fUTC = HB_TRUE; ++szTime; + } else { while( HB_ISSPACE( *szTime ) ) @@ -601,6 +605,7 @@ HB_BOOL hb_timeStrGetUTC( const char * szTime, iUTCOffset *= 60; if( fMinus ) iUTCOffset = -iUTCOffset; + fUTC = HB_TRUE; } } } @@ -611,7 +616,10 @@ HB_BOOL hb_timeStrGetUTC( const char * szTime, iUTCOffset >= -43200 && iUTCOffset <= 43200 ) fValid = HB_TRUE; else - iHour = iMinutes = iSeconds = iMSec = 0; + { + iHour = iMinutes = iSeconds = iMSec = iUTCOffset = 0; + fUTC = HB_FALSE; + } } } @@ -625,6 +633,8 @@ HB_BOOL hb_timeStrGetUTC( const char * szTime, *piMSec = iMSec; if( piUTCOffset ) *piUTCOffset = iUTCOffset; + if( pfUTC ) + *pfUTC = fUTC; return fValid; } @@ -636,7 +646,7 @@ HB_BOOL hb_timeStrGet( const char * szTime, HB_TRACE( HB_TR_DEBUG, ( "hb_timeStrGet(%s, %p, %p, %p, %p)", szTime, ( void * ) piHour, ( void * ) piMinutes, ( void * ) piSeconds, ( void * ) piMSec ) ); return hb_timeStrGetUTC( szTime, piHour, piMinutes, - piSeconds, piMSec, NULL ); + piSeconds, piMSec, NULL, NULL ); } void hb_timeStrRawGet( const char * szTime, @@ -760,12 +770,12 @@ char * hb_timeStampStr( char * szDateTime, long lJulian, long lMilliSec ) HB_BOOL hb_timeStampStrGetUTC( const char * szDateTime, int * piYear, int * piMonth, int * piDay, int * piHour, int * piMinutes, int * piSeconds, - int * piMSec, int * piUTCOffset ) + int * piMSec, int * piUTCOffset, HB_BOOL * pfUTC ) { int iYear, iMonth, iDay; HB_BOOL fValid; - HB_TRACE( HB_TR_DEBUG, ( "hb_timeStampStrGetUTC(%s, %p, %p, %p, %p, %p, %p, %p, %p)", szDateTime, ( void * ) piYear, ( void * ) piMonth, ( void * ) piDay, ( void * ) piHour, ( void * ) piMinutes, ( void * ) piSeconds, ( void * ) piMSec, ( void * ) piUTCOffset ) ); + HB_TRACE( HB_TR_DEBUG, ( "hb_timeStampStrGetUTC(%s, %p, %p, %p, %p, %p, %p, %p, %p, %p)", szDateTime, ( void * ) piYear, ( void * ) piMonth, ( void * ) piDay, ( void * ) piHour, ( void * ) piMinutes, ( void * ) piSeconds, ( void * ) piMSec, ( void * ) piUTCOffset, ( void * ) pfUTC ) ); iYear = iMonth = iDay = 0; fValid = HB_FALSE; @@ -865,7 +875,7 @@ HB_BOOL hb_timeStampStrGetUTC( const char * szDateTime, ( ! fValid && szDateTime ) ) { if( hb_timeStrGetUTC( szDateTime, piHour, piMinutes, piSeconds, - piMSec, piUTCOffset ) ) + piMSec, piUTCOffset, pfUTC ) ) fValid = HB_TRUE; else if( szDateTime ) fValid = HB_FALSE; @@ -892,24 +902,26 @@ HB_BOOL hb_timeStampStrGet( const char * szDateTime, return hb_timeStampStrGetUTC( szDateTime, piYear, piMonth, piDay, piHour, piMinutes, piSeconds, - piMSec, NULL ); + piMSec, NULL, NULL ); } -HB_BOOL hb_timeStampStrGetDT( const char * szDateTime, - long * plJulian, long * plMilliSec ) +HB_BOOL hb_timeStampStrGetDTU( const char * szDateTime, + long * plJulian, long * plMilliSec, HB_BOOL * pfUTC ) { int iYear, iMonth, iDay, iHour, iMinutes, iSeconds, iMSec, iUTCOffset; - HB_BOOL fValid; + HB_BOOL fValid, fUTC; - HB_TRACE( HB_TR_DEBUG, ( "hb_timeStampStrGetDT(%s, %p, %p)", szDateTime, ( void * ) plJulian, ( void * ) plMilliSec ) ); + HB_TRACE( HB_TR_DEBUG, ( "hb_timeStampStrGetDTU(%s, %p, %p, %p)", szDateTime, ( void * ) plJulian, ( void * ) plMilliSec, ( void * ) pfUTC ) ); fValid = hb_timeStampStrGetUTC( szDateTime, &iYear, &iMonth, &iDay, &iHour, &iMinutes, &iSeconds, &iMSec, - &iUTCOffset ); + &iUTCOffset, &fUTC ); if( plJulian ) *plJulian = hb_dateEncode( iYear, iMonth, iDay ); if( plMilliSec ) *plMilliSec = hb_timeEncode( iHour, iMinutes, iSeconds, iMSec ); + if( pfUTC ) + *pfUTC = fUTC; if( iUTCOffset != 0 && fValid ) { @@ -930,6 +942,14 @@ HB_BOOL hb_timeStampStrGetDT( const char * szDateTime, return fValid; } +HB_BOOL hb_timeStampStrGetDT( const char * szDateTime, + long * plJulian, long * plMilliSec ) +{ + HB_TRACE( HB_TR_DEBUG, ( "hb_timeStampStrGetDT(%s, %p, %p)", szDateTime, ( void * ) plJulian, ( void * ) plMilliSec ) ); + + return hb_timeStampStrGetDTU( szDateTime, plJulian, plMilliSec, NULL ); +} + double hb_timeStampPackDT( long lJulian, long lMilliSec ) { HB_TRACE( HB_TR_DEBUG, ( "hb_timeStampPackDT(%ld, %ld)", lJulian, lMilliSec ) ); diff --git a/src/rtl/dateshb.c b/src/rtl/dateshb.c index 3c1fb41db6..a287858a56 100644 --- a/src/rtl/dateshb.c +++ b/src/rtl/dateshb.c @@ -559,9 +559,11 @@ HB_FUNC( HB_STRTOTS ) if( szDateTime ) { long lDate, lTime; + HB_BOOL fUTC; - hb_timeStampStrGetDT( szDateTime, &lDate, &lTime ); + hb_timeStampStrGetDTU( szDateTime, &lDate, &lTime, &fUTC ); hb_rettdt( lDate, lTime ); + hb_storl( fUTC, 2 ); } else hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );