206 lines
5.7 KiB
C++
206 lines
5.7 KiB
C++
|
//#pragma title( "Common.cpp - Common class implementations" )
|
||
|
/*
|
||
|
Copyright (c) 1995-1998, Mission Critical Software, Inc. All rights reserved.
|
||
|
===============================================================================
|
||
|
Module - Common.cpp
|
||
|
System - Common
|
||
|
Author - Tom Bernhardt, Rich Denham
|
||
|
Created - 1994-08-22
|
||
|
Description - Common class implementations.
|
||
|
Updates - 1997-09-09 RED ErrorCodeToText moved to Err.cpp
|
||
|
- 1997-09-12 RED replace TTime class
|
||
|
===============================================================================
|
||
|
*/
|
||
|
|
||
|
#ifdef USE_STDAFX
|
||
|
# include "stdafx.h"
|
||
|
# include "rpc.h"
|
||
|
#else
|
||
|
# include <windows.h>
|
||
|
#endif
|
||
|
|
||
|
#include "Common.hpp"
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// TTime class member functions
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
TTime gTTime; // global instance of TTime
|
||
|
|
||
|
time_t // ret-current time
|
||
|
TTime::Now(
|
||
|
time_t * pTime // out-optional current time
|
||
|
) const
|
||
|
{
|
||
|
time_t tTime; // work copy of current time
|
||
|
|
||
|
union
|
||
|
{
|
||
|
__int64 intTime;
|
||
|
FILETIME fileTime;
|
||
|
} wTime;
|
||
|
GetSystemTimeAsFileTime( &wTime.fileTime );
|
||
|
tTime = ConvertFiletimeToTimet( wTime.intTime );
|
||
|
|
||
|
if ( pTime ) *pTime = tTime;
|
||
|
return tTime;
|
||
|
}
|
||
|
|
||
|
__int64 // ret-current time
|
||
|
TTime::NowAsFiletime(
|
||
|
__int64 * pTime // out-optional current time
|
||
|
) const
|
||
|
{
|
||
|
union
|
||
|
{
|
||
|
__int64 intTime;
|
||
|
FILETIME fileTime;
|
||
|
} wTime;
|
||
|
GetSystemTimeAsFileTime( &wTime.fileTime );
|
||
|
if ( pTime ) *pTime = wTime.intTime;
|
||
|
return wTime.intTime;
|
||
|
}
|
||
|
|
||
|
time_t // ret-time_t representation
|
||
|
TTime::ConvertFiletimeToTimet(
|
||
|
__int64 fileTime // in -filetime representation
|
||
|
) const
|
||
|
{
|
||
|
__int64 wTime; // intermediate work area
|
||
|
time_t retTime; // returned time
|
||
|
|
||
|
// If the source date/time is less than the minimum date/time supported
|
||
|
// by time_t, then zero is returned.
|
||
|
// If the source date/time is more that the maximum date/time supported
|
||
|
// by time_t, then ULONG_MAX is returned.
|
||
|
|
||
|
wTime = fileTime / 10000000;
|
||
|
|
||
|
if ( wTime < 11644473600 )
|
||
|
{
|
||
|
retTime = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
wTime -= 11644473600;
|
||
|
if ( wTime > ULONG_MAX )
|
||
|
{
|
||
|
retTime = ULONG_MAX;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
retTime = (time_t) wTime;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return retTime;
|
||
|
}
|
||
|
|
||
|
|
||
|
WCHAR * // ret-YYYY-MM-DD HH:MM:SS string
|
||
|
TTime::FormatIsoUtc(
|
||
|
time_t tTime ,// in -time_t representation
|
||
|
WCHAR * sTime // out-YYYY-MM-DD HH:MM:SS string
|
||
|
) const
|
||
|
{
|
||
|
struct tm * tmTime;
|
||
|
|
||
|
tmTime = gmtime( &tTime );
|
||
|
tmTime->tm_year += tmTime->tm_year >= 70 ? 1900 : 2000;
|
||
|
swprintf(
|
||
|
sTime,
|
||
|
L"%04d-%02d-%02d %02d:%02d:%02d",
|
||
|
tmTime->tm_year,
|
||
|
tmTime->tm_mon+1,
|
||
|
tmTime->tm_mday,
|
||
|
tmTime->tm_hour,
|
||
|
tmTime->tm_min,
|
||
|
tmTime->tm_sec );
|
||
|
|
||
|
return sTime;
|
||
|
}
|
||
|
|
||
|
WCHAR * // ret-YYYY-MM-DD HH:MM:SS string
|
||
|
TTime::FormatIsoLcl(
|
||
|
time_t tTime ,// in -time_t representation
|
||
|
WCHAR * sTime // out-YYYY-MM-DD HH:MM:SS string
|
||
|
) const
|
||
|
{
|
||
|
struct tm * tmTime;
|
||
|
|
||
|
TIME_ZONE_INFORMATION infoTime; // WIN32 time zone info
|
||
|
time_t wTime; // workarea
|
||
|
switch ( GetTimeZoneInformation( &infoTime ) )
|
||
|
{
|
||
|
case TIME_ZONE_ID_STANDARD:
|
||
|
wTime = infoTime.StandardBias;
|
||
|
break;
|
||
|
case TIME_ZONE_ID_DAYLIGHT:
|
||
|
wTime = infoTime.DaylightBias;
|
||
|
break;
|
||
|
default:
|
||
|
wTime = 0;
|
||
|
break;
|
||
|
}
|
||
|
wTime = (infoTime.Bias + wTime) * 60;
|
||
|
wTime = tTime - wTime;
|
||
|
if ( wTime < 0 )
|
||
|
{
|
||
|
wTime = 0;
|
||
|
}
|
||
|
tmTime = gmtime( &wTime );
|
||
|
tmTime->tm_year += tmTime->tm_year >= 70 ? 1900 : 2000;
|
||
|
swprintf(
|
||
|
sTime,
|
||
|
L"%04d-%02d-%02d %02d:%02d:%02d",
|
||
|
tmTime->tm_year,
|
||
|
tmTime->tm_mon+1,
|
||
|
tmTime->tm_mday,
|
||
|
tmTime->tm_hour,
|
||
|
tmTime->tm_min,
|
||
|
tmTime->tm_sec );
|
||
|
|
||
|
return sTime;
|
||
|
}
|
||
|
|
||
|
// Return time zone information
|
||
|
// If the returned value is TRUE, the EaTimeZoneInfo structure is filled in
|
||
|
// If the returned value is FALSE, the EaTimeZoneInfo structure is all zeroes
|
||
|
// Note: UTC (gTTime.Now( NULL )) plus pTimeZoneInfo->biasdst is the local date/time
|
||
|
BOOL
|
||
|
EaGetTimeZoneInfo(
|
||
|
EaTimeZoneInfo * pTimeZoneInfo // in -time zone information
|
||
|
)
|
||
|
{
|
||
|
memset( pTimeZoneInfo, 0, sizeof *pTimeZoneInfo );
|
||
|
BOOL retval=TRUE; // returned value
|
||
|
DWORD OsRc; // OS return code
|
||
|
TIME_ZONE_INFORMATION TimeZoneInfo; // WIN32 time zone info
|
||
|
|
||
|
OsRc = GetTimeZoneInformation( &TimeZoneInfo );
|
||
|
switch ( OsRc )
|
||
|
{
|
||
|
case TIME_ZONE_ID_STANDARD:
|
||
|
pTimeZoneInfo->dst = TimeZoneInfo.StandardBias;
|
||
|
break;
|
||
|
case TIME_ZONE_ID_DAYLIGHT:
|
||
|
pTimeZoneInfo->dst = TimeZoneInfo.DaylightBias;
|
||
|
break;
|
||
|
case TIME_ZONE_ID_UNKNOWN:
|
||
|
retval = TimeZoneInfo.Bias;
|
||
|
break;
|
||
|
default:
|
||
|
retval = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
if ( retval )
|
||
|
{
|
||
|
pTimeZoneInfo->bias = TimeZoneInfo.Bias * 60;
|
||
|
pTimeZoneInfo->dst *= 60;
|
||
|
pTimeZoneInfo->biasdst = pTimeZoneInfo->bias + pTimeZoneInfo->dst;
|
||
|
}
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
// Common.cpp - end of file
|