www.pudn.com > acdx.rar > TimeStamp.cpp


#include "StdAfx.h" 
#include "TimeStamp.h" 
 
#include  
 
 
#if defined(_DEBUG) 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
 
///////////////////////////////////////////////////////////////////////////////////////// 
// conversion methods 
 
double DoubleFromDate(DATE date) 
{ 
	// No problem if positive 
	if (date >= 0) 
		return date; 
 
	try 
	{ 
		// If negative, must convert since negative dates not continuous 
		// (examples: -1.25 to -.75, -1.50 to -.50, -1.75 to -.25) 
		double temp = ceil(date); 
		return temp - (date - temp); 
	} 
	catch(...) 
	{ 
		_ASSERT(FALSE); 
	} 
} 
 
DATE DateFromDouble(double date) 
{ 
	// No problem if positive 
	if (date >= 0) 
		return date; 
	try 
	{ 
		// If negative, must convert since negative dates not continuous 
		// (examples: -.75 to -1.25, -.50 to -1.50, -.25 to -1.75) 
		double temp = floor(date); // dbl is now whole part 
		return temp + (temp - date); 
	} 
	catch(...) 
	{ 
		_ASSERT(FALSE); 
	} 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// TimeStamp class 
 
////////////////////////////////////////////////////////////////////////////////////// 
// constructors 
 
//##ModelId=424BB63F03E0 
TimeStamp::TimeStamp() 
{  
	m_timestamp = 0;  
	m_valid = valid;  
 
	setDefaultFormat(); 
} 
 
//##ModelId=424BB63F03E1 
TimeStamp::TimeStamp(TimeStamp& dateSrc) 
{  
	m_timestamp = dateSrc.m_timestamp;  
	m_valid = dateSrc.m_valid;  
 
	setDefaultFormat(); 
} 
 
//##ModelId=424BB6400007 
TimeStamp::TimeStamp(VARIANT& varSrc) 
{  
	*this = varSrc;  
 
	setDefaultFormat(); 
} 
 
//##ModelId=424BB6400009 
TimeStamp::TimeStamp(DATE dtSrc) 
{  
	m_timestamp = dtSrc;  
	m_valid = valid;  
 
	setDefaultFormat(); 
} 
 
//##ModelId=424BB6400017 
TimeStamp::TimeStamp(SYSTEMTIME& systimeSrc) 
{  
	*this = systimeSrc;  
 
	setDefaultFormat(); 
} 
 
//##ModelId=424BB6400019 
TimeStamp::TimeStamp(FILETIME& filetimeSrc) 
{  
	*this = filetimeSrc;  
 
	setDefaultFormat(); 
} 
 
//##ModelId=424BB6400027 
TimeStamp::TimeStamp(long year, long month, long day, 
	           long hour, long minute, long second ) 
{  
	setDateTime(year, month, day, hour, minute, second);  
 
	setDefaultFormat(); 
} 
 
////////////////////////////////////////////////////////////////////////////////////// 
// get current time stamp 
 
//##ModelId=424BB64000A5 
void TimeStamp::getCurTimeStamp	() 
{ 
	// get local time 
	SYSTEMTIME sysTime; 
	::GetLocalTime(&sysTime); 
 
	// convert to variant date 
	*this = sysTime; 
} 
 
//##ModelId=424BB64000A6 
void TimeStamp::getCurTimeStamp ( DATE & timestamp ) 
{	 
	// get local time 
	SYSTEMTIME sysTime; 
	::GetLocalTime(&sysTime); 
 
	// convert to variant date 
	SystemTimeToVariantTime(&sysTime,×tamp); 
} 
 
 
 
//##ModelId=424BB64000B4 
void TimeStamp::getCurTimeStamp ( string & str ) 
{ 
	DATE timestamp; 
	getCurTimeStamp(timestamp); 
 
	getTimeStamp(timestamp,str); 
} 
 
 
////////////////////////////////////////////////////////////////////////////////////// 
// access methods 
 
//##ModelId=424BB64000C4 
long TimeStamp::getYear() 
{ 
	if ( m_valid != valid ) 
		return -1; 
 
	SYSTEMTIME sysTime; 
	if ( VariantTimeToSystemTime(m_timestamp,&sysTime) ) 
		return (long) sysTime.wYear; 
	else 
		return -1; 
} 
 
//##ModelId=424BB64000C5 
long TimeStamp::getMonth() 
{ 
	if ( m_valid != valid ) 
		return -1; 
 
	SYSTEMTIME sysTime; 
	if ( VariantTimeToSystemTime(m_timestamp,&sysTime) ) 
		return (long) sysTime.wMonth; 
	else 
		return -1; 
} 
 
//##ModelId=424BB64000D2 
long TimeStamp::getDay() 
{ 
	if ( m_valid != valid ) 
		return -1; 
 
	SYSTEMTIME sysTime; 
	if ( VariantTimeToSystemTime(m_timestamp,&sysTime) ) 
		return (long) sysTime.wDay; 
	else 
		return -1; 
} 
 
//##ModelId=424BB64000D3 
long TimeStamp::getHour() 
{ 
	if ( m_valid != valid ) 
		return -1; 
 
	SYSTEMTIME sysTime; 
	if ( VariantTimeToSystemTime(m_timestamp,&sysTime) ) 
		return (long) sysTime.wHour; 
	else 
		return -1; 
} 
 
//##ModelId=424BB64000E2 
long TimeStamp::getMinute() 
{ 
	if ( m_valid != valid ) 
		return -1; 
 
	SYSTEMTIME sysTime; 
	if ( VariantTimeToSystemTime(m_timestamp,&sysTime) ) 
		return (long) sysTime.wMinute; 
	else 
		return -1; 
} 
 
//##ModelId=424BB64000E3 
long TimeStamp::getSecond() 
{ 
	if ( m_valid != valid ) 
		return -1; 
 
	SYSTEMTIME sysTime; 
	if ( VariantTimeToSystemTime(m_timestamp,&sysTime) ) 
		return (long) sysTime.wSecond; 
	else 
		return -1; 
} 
 
//##ModelId=424BB64000E4 
long TimeStamp::getDayOfWeek() 
{ 
	if ( m_valid != valid ) 
		return -1; 
 
	SYSTEMTIME sysTime; 
	if ( VariantTimeToSystemTime(m_timestamp,&sysTime) ) 
		return (long) sysTime.wDay; 
	else 
		return -1; 
} 
 
//##ModelId=424BB6400112 
void TimeStamp::operator=( VARIANT& varSrc ) 
{ 
	if (varSrc.vt == VT_DATE) 
	{ 
		m_timestamp = varSrc.date; 
		m_valid = valid; 
	} 
} 
 
//##ModelId=424BB6400122 
void TimeStamp::operator=(DATE dtSrc) 
{ 
	m_timestamp = dtSrc; 
	m_valid = valid; 
} 
 
//##ModelId=424BB6400131 
void TimeStamp::operator=( SYSTEMTIME & sysTime ) 
{ 
	if ( SystemTimeToVariantTime(&sysTime,&m_timestamp) )		 
		m_valid = valid; 
	else 
		m_valid = invalid; 
} 
 
//##ModelId=424BB640014F 
void TimeStamp::operator=( FILETIME & fileTime ) 
{ 
	m_valid = invalid; 
 
	// convert to sys time then to ole time 
	SYSTEMTIME sysTime; 
	if ( FileTimeToSystemTime(&fileTime, &sysTime) ) 
	{ 
		if ( SystemTimeToVariantTime(&sysTime,&m_timestamp) )		 
			m_valid = valid; 
	} 
} 
 
//##ModelId=424BB640017E 
bool TimeStamp::operator<( const TimeStamp& ts) 
{ 
	// Handle negative dates 
	return DoubleFromDate(m_timestamp) < DoubleFromDate(ts.m_timestamp); 
} 
 
//##ModelId=424BB640018E 
bool TimeStamp::operator>( const TimeStamp& ts) 
{ 
	// Handle negative dates 
	return DoubleFromDate(m_timestamp) > DoubleFromDate(ts.m_timestamp); 
} 
 
//##ModelId=424BB6400190 
bool TimeStamp::operator<=( const TimeStamp& ts) 
{ 
	// Handle negative dates 
	return DoubleFromDate(m_timestamp) <= DoubleFromDate(ts.m_timestamp); 
} 
 
//##ModelId=424BB640019E 
bool TimeStamp::operator>=( const TimeStamp& ts) 
{ 
	// Handle negative dates 
	return DoubleFromDate(m_timestamp) >= DoubleFromDate(ts.m_timestamp); 
} 
 
//##ModelId=424BB64001A0 
TimeStamp TimeStamp::operator+( TimeStamp & ts ) 
{ 
	TimeStamp result; 
 
	// Compute the actual date difference by adding underlying dates 
	result = DateFromDouble(DoubleFromDate(m_timestamp) + ts.m_timestamp); 
 
	result.isValid(); 
 
	return result; 
} 
 
//##ModelId=424BB64001AE 
TimeStamp TimeStamp::operator-( TimeStamp & ts ) 
{ 
	TimeStamp result; 
 
 
	// Return result (span can't be invalid, so don't check range) 
	return DoubleFromDate(m_timestamp) - DoubleFromDate(ts.m_timestamp); 
} 
 
//##ModelId=424BB64001CE 
void TimeStamp::setDateTime(long year, long month, long day, 
	                    long hour, long minute, long second ) 
{ 
	// convert to sys time 
	SYSTEMTIME sysTime; 
	sysTime.wYear = year;  
	sysTime.wMonth = minute;  
	sysTime.wDay = day;  
	sysTime.wHour = hour;  
	sysTime.wMinute = minute;  
	sysTime.wSecond = second;  
 
	// convert to ole date 
	if ( SystemTimeToVariantTime(&sysTime,&m_timestamp) )		 
		m_valid = valid; 
	else 
		m_valid = invalid; 
} 
 
 
//##ModelId=424BB6400269 
bool TimeStamp::isValid () 
{ 
	// about year 100 to about 9999 
	if ( m_timestamp > MAX_DATE || m_timestamp < MIN_DATE )  
	{ 
		m_valid = invalid; 
		return false; 
	} 
 
	else 
	{ 
		m_valid = valid; 
		return true; 
	} 
} 
 
 
//////////////////////////////////////////////////////////////////// 
// format methods 
 
//##ModelId=424BB6400048 
void TimeStamp::setDefaultFormat () 
{ 
	// "h:mm:ss tt" 
	string str = "h:mm:ss tt"; 
	setFormat(str); 
} 
 
//##ModelId=424BB6400046 
string TimeStamp::format ( LPTSTR strFormat ) 
{ 
	// #DGH 
	// need to modify  
	// and check  
 
	// init sys time struct 
	SYSTEMTIME sysTime; 
	memset(&sysTime,0,sizeof(sysTime)); 
	VariantTimeToSystemTime(m_timestamp,&sysTime); 
 
	// set the flags 
	DWORD flags = 0; 
 
	// get time 
	char str[128]; 
	DWORD count =  
	GetTimeFormat( LOCALE_USER_DEFAULT, flags, &sysTime,  
		           strFormat, str, 128 ); 
 
	if ( count == 0 ) 
	{ 
		DWORD error = GetLastError(); 
		return string(""); 
	} 
	else 
	{ 
		return string( str ); 
	} 
} 
 
 
//##ModelId=424BB6400055 
void TimeStamp::setFormat ( string & strFormat ) 
{ 
 
	// "h:mm:ss tt" 
	if ( strFormat == "h:mm:ss tt" ) 
	{ 
		m_standard = true; 
	} 
 
	// "hh:mm:ss tt" 
	else if ( strFormat == "hh:mm:ss tt" ) 
	{ 
		m_standard = true; 
	} 
 
	// "H:mm:ss" 
	else if ( strFormat == "H:mm:ss" ) 
	{ 
		m_standard = false; 
	} 
 
	// "HH:mm:ss" 
	else if ( strFormat == "HH:mm:ss" ) 
	{ 
		m_standard = false; 
	} 
	else  
		return; 
 
	m_format = strFormat; 
} 
 
//##ModelId=424BB6400095 
void TimeStamp::getTimeStamp ( DATE timestamp, string & timestampStr ) 
{ 
	TCHAR str[128]; 
 
	// init sys time struct 
	SYSTEMTIME sysTime; 
	VariantTimeToSystemTime(timestamp,&sysTime); 
 
	// get date 
	DWORD count = 
	GetDateFormat( LOCALE_USER_DEFAULT,  
	               DATE_SHORTDATE,  
				   &sysTime,  
		           NULL, str, 128 ); 
 
	if ( count != 0 ) 
		timestampStr = str; 
 
	// get time 
	count =  
	GetTimeFormat( LOCALE_USER_DEFAULT,  
	               0,  
	               &sysTime,  
		           "hh::mm::ss tt", str, 128 ); 
 
	if ( count != 0 ) 
	{ 
		timestampStr += " "; 
		timestampStr += str; 
	} 
} 
 
 
 
 
//##ModelId=424BB6400084 
bool TimeStamp::getTimeStamp ( string & timestamp, string & format, DWORD flags, LCID lcid) 
{ 
	TCHAR str[128]; 
	DWORD error; 
 
	bool success = true; 
 
	// init sys time struct 
	SYSTEMTIME sysTime; 
	VariantTimeToSystemTime(m_timestamp,&sysTime); 
 
	// get time 
	DWORD count =  
	GetTimeFormat( lcid, flags, &sysTime,  
		           format.c_str(), str, 128 ); 
 
	if ( count == 0 ) 
	{ 
		error   = GetLastError(); 
		success = false; 
	} 
	else 
		timestamp = str; 
 
	// get date 
	count = 
	GetDateFormat( lcid, flags, &sysTime,  
		           format.c_str(), str, 128 ); 
 
	if ( count == 0 ) 
	{ 
		error   = GetLastError(); 
		success = false; 
	} 
	else 
	{ 
		timestamp += " "; 
		timestamp += str; 
	} 
 
	return success; 
} 
 
 
 
//##ModelId=424BB6400076 
bool TimeStamp::getTimeStamp ( string & str, bool showSeconds ) 
{ 
	string timeStr; 
	getTimeStr( timeStr, false ); 
 
	string dateStr; 
	getDateStr( dateStr, true ); 
 
	stringstream strm; 
	strm << dateStr; 
	strm << " " << timeStr; 
 
	str = strm.str(); 
	return true; 
} 
 
//##ModelId=424BB6400057 
void TimeStamp::getTimeStr ( string & timeStr, bool showSeconds ) 
{ 
	// init sys time struct 
	SYSTEMTIME sysTime; 
	memset(&sysTime,0,sizeof(sysTime)); 
	VariantTimeToSystemTime(m_timestamp,&sysTime); 
 
	// get the seconds 
	DWORD flags = 0; 
	if ( !showSeconds ) 
	{ 
		flags |= TIME_NOSECONDS; 
		sysTime.wSecond = 0; 
	} 
 
	// set military flags 
	if ( !m_standard ) 
		flags |= TIME_FORCE24HOURFORMAT | TIME_NOTIMEMARKER; 
 
	// get time 
	char str[128]; 
	DWORD count =  
	GetTimeFormat( LOCALE_USER_DEFAULT, flags, &sysTime,  
		           m_format.c_str(), str, 128 ); 
 
	if ( count == 0 ) 
	{ 
		DWORD error = GetLastError(); 
	} 
	else 
		timeStr = str; 
} 
 
//##ModelId=424BB6400066 
void TimeStamp::getDateStr ( string & dateStr, bool useShortDateFormat ) 
{ 
	// init sys time struct 
	SYSTEMTIME time; 
	memset(&time,0,sizeof(time)); 
 
	// get the time 
	time.wMonth = getMonth(); 
	time.wDay = getDay(); 
	time.wYear = getYear(); 
 
 
	// set flags 
	DWORD flags = 0; 
	if ( useShortDateFormat ) 
		flags |= DATE_SHORTDATE; 
	else 
		flags |= DATE_LONGDATE; 
 
	// get time 
	char str[128]; 
 
	DWORD count = 
	GetDateFormat( LOCALE_USER_DEFAULT, flags, &time,  
		           NULL, str, 128 ); 
 
	if ( count == 0 ) 
	{ 
		DWORD error = GetLastError(); 
	} 
	else 
		dateStr = str; 
}