//#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 #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