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( <cTimeStr> [, @<lUTC> ] ) -> <tTime>
This commit is contained in:
Przemysław Czerpak
2025-12-13 19:38:15 +01:00
parent 5b05d5335d
commit 1411ce7f9c
4 changed files with 85 additions and 19 deletions

View File

@@ -7,6 +7,48 @@
Entries may not always be in chronological/commit order. Entries may not always be in chronological/commit order.
See license at the end of file. */ 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( <cTimeStr> [, @<lUTC> ] ) -> <tTime>
2025-12-12 04:09 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) 2025-12-12 04:09 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* include/harbour.hbx * include/harbour.hbx
* src/harbour.def * src/harbour.def

View File

@@ -90,7 +90,7 @@ extern HB_EXPORT HB_BOOL hb_timeStrGet( const char * szTime,
int * piSeconds, int * piMSec ); int * piSeconds, int * piMSec );
extern HB_EXPORT HB_BOOL hb_timeStrGetUTC( const char * szTime, extern HB_EXPORT HB_BOOL hb_timeStrGetUTC( const char * szTime,
int * piHour, int * piMinutes, int * piSeconds, 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, extern HB_EXPORT void hb_timeStrRawGet( const char * szTime,
int * piHour, int * piMinutes, int * piHour, int * piMinutes,
int * piSeconds, int * piMSec ); 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, extern HB_EXPORT HB_BOOL hb_timeStampStrGetUTC( const char * szDateTime,
int * piYear, int * piMonth, int * piDay, int * piYear, int * piMonth, int * piDay,
int * piHour, int * piMinutes, int * piSeconds, 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, 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 double hb_timeStampPackDT( long lJulian, long lMilliSec );
extern HB_EXPORT void hb_timeStampUnpackDT( double dTimeStamp, extern HB_EXPORT void hb_timeStampUnpackDT( double dTimeStamp,

View File

@@ -495,15 +495,16 @@ char * hb_timeStr( char * szTime, long lMilliSec )
HB_BOOL hb_timeStrGetUTC( const char * szTime, HB_BOOL hb_timeStrGetUTC( const char * szTime,
int * piHour, int * piMinutes, 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; 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; iHour = iMinutes = iSeconds = iMSec = iUTCOffset = iBlocks = 0;
fValid = HB_FALSE; fValid = fUTC = HB_FALSE;
if( szTime ) if( szTime )
{ {
@@ -549,7 +550,10 @@ HB_BOOL hb_timeStrGetUTC( const char * szTime,
} }
} }
if( iBlocks > 0 && ( szTime[ 0 ] == 'Z' || szTime[ 0 ] == 'z' ) ) if( iBlocks > 0 && ( szTime[ 0 ] == 'Z' || szTime[ 0 ] == 'z' ) )
{
fUTC = HB_TRUE;
++szTime; ++szTime;
}
else else
{ {
while( HB_ISSPACE( *szTime ) ) while( HB_ISSPACE( *szTime ) )
@@ -601,6 +605,7 @@ HB_BOOL hb_timeStrGetUTC( const char * szTime,
iUTCOffset *= 60; iUTCOffset *= 60;
if( fMinus ) if( fMinus )
iUTCOffset = -iUTCOffset; iUTCOffset = -iUTCOffset;
fUTC = HB_TRUE;
} }
} }
} }
@@ -611,7 +616,10 @@ HB_BOOL hb_timeStrGetUTC( const char * szTime,
iUTCOffset >= -43200 && iUTCOffset <= 43200 ) iUTCOffset >= -43200 && iUTCOffset <= 43200 )
fValid = HB_TRUE; fValid = HB_TRUE;
else 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; *piMSec = iMSec;
if( piUTCOffset ) if( piUTCOffset )
*piUTCOffset = iUTCOffset; *piUTCOffset = iUTCOffset;
if( pfUTC )
*pfUTC = fUTC;
return fValid; 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 ) ); 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, return hb_timeStrGetUTC( szTime, piHour, piMinutes,
piSeconds, piMSec, NULL ); piSeconds, piMSec, NULL, NULL );
} }
void hb_timeStrRawGet( const char * szTime, 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, HB_BOOL hb_timeStampStrGetUTC( const char * szDateTime,
int * piYear, int * piMonth, int * piDay, int * piYear, int * piMonth, int * piDay,
int * piHour, int * piMinutes, int * piSeconds, int * piHour, int * piMinutes, int * piSeconds,
int * piMSec, int * piUTCOffset ) int * piMSec, int * piUTCOffset, HB_BOOL * pfUTC )
{ {
int iYear, iMonth, iDay; int iYear, iMonth, iDay;
HB_BOOL fValid; 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; iYear = iMonth = iDay = 0;
fValid = HB_FALSE; fValid = HB_FALSE;
@@ -865,7 +875,7 @@ HB_BOOL hb_timeStampStrGetUTC( const char * szDateTime,
( ! fValid && szDateTime ) ) ( ! fValid && szDateTime ) )
{ {
if( hb_timeStrGetUTC( szDateTime, piHour, piMinutes, piSeconds, if( hb_timeStrGetUTC( szDateTime, piHour, piMinutes, piSeconds,
piMSec, piUTCOffset ) ) piMSec, piUTCOffset, pfUTC ) )
fValid = HB_TRUE; fValid = HB_TRUE;
else if( szDateTime ) else if( szDateTime )
fValid = HB_FALSE; fValid = HB_FALSE;
@@ -892,24 +902,26 @@ HB_BOOL hb_timeStampStrGet( const char * szDateTime,
return hb_timeStampStrGetUTC( szDateTime, piYear, piMonth, piDay, return hb_timeStampStrGetUTC( szDateTime, piYear, piMonth, piDay,
piHour, piMinutes, piSeconds, piHour, piMinutes, piSeconds,
piMSec, NULL ); piMSec, NULL, NULL );
} }
HB_BOOL hb_timeStampStrGetDT( const char * szDateTime, HB_BOOL hb_timeStampStrGetDTU( const char * szDateTime,
long * plJulian, long * plMilliSec ) long * plJulian, long * plMilliSec, HB_BOOL * pfUTC )
{ {
int iYear, iMonth, iDay, iHour, iMinutes, iSeconds, iMSec, iUTCOffset; 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, fValid = hb_timeStampStrGetUTC( szDateTime, &iYear, &iMonth, &iDay,
&iHour, &iMinutes, &iSeconds, &iMSec, &iHour, &iMinutes, &iSeconds, &iMSec,
&iUTCOffset ); &iUTCOffset, &fUTC );
if( plJulian ) if( plJulian )
*plJulian = hb_dateEncode( iYear, iMonth, iDay ); *plJulian = hb_dateEncode( iYear, iMonth, iDay );
if( plMilliSec ) if( plMilliSec )
*plMilliSec = hb_timeEncode( iHour, iMinutes, iSeconds, iMSec ); *plMilliSec = hb_timeEncode( iHour, iMinutes, iSeconds, iMSec );
if( pfUTC )
*pfUTC = fUTC;
if( iUTCOffset != 0 && fValid ) if( iUTCOffset != 0 && fValid )
{ {
@@ -930,6 +942,14 @@ HB_BOOL hb_timeStampStrGetDT( const char * szDateTime,
return fValid; 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 ) double hb_timeStampPackDT( long lJulian, long lMilliSec )
{ {
HB_TRACE( HB_TR_DEBUG, ( "hb_timeStampPackDT(%ld, %ld)", lJulian, lMilliSec ) ); HB_TRACE( HB_TR_DEBUG, ( "hb_timeStampPackDT(%ld, %ld)", lJulian, lMilliSec ) );

View File

@@ -559,9 +559,11 @@ HB_FUNC( HB_STRTOTS )
if( szDateTime ) if( szDateTime )
{ {
long lDate, lTime; long lDate, lTime;
HB_BOOL fUTC;
hb_timeStampStrGetDT( szDateTime, &lDate, &lTime ); hb_timeStampStrGetDTU( szDateTime, &lDate, &lTime, &fUTC );
hb_rettdt( lDate, lTime ); hb_rettdt( lDate, lTime );
hb_storl( fUTC, 2 );
} }
else else
hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );