⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sptime.cpp

📁 股软 通达信行情接收接口, 包括美元汇率
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.

#include	"stdafx.h"
#include	"SpTime.h"
#include	<TCHAR.H>

#ifdef AFX_AUX_SEG
#pragma code_seg(AFX_AUX_SEG)
#endif

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSPTimeSpan
CSPTimeSpan::CSPTimeSpan()
	{ }
CSPTimeSpan::CSPTimeSpan(time_t time)
	{ m_timeSpan = time; }
CSPTimeSpan::CSPTimeSpan(LONG lDays, int nHours, int nMins, int nSecs)
	{ m_timeSpan = nSecs + 60* (nMins + 60* (nHours + 24* lDays)); }
CSPTimeSpan::CSPTimeSpan(const CSPTimeSpan& timeSpanSrc)
	{ m_timeSpan = timeSpanSrc.m_timeSpan; }

/////////////////////////////////////////////////////////////////////////////
// CSPTime - absolute time

CSPTime::CSPTime()
	{ }
CSPTime::CSPTime(time_t time)
	{ m_time = time; }
CSPTime::CSPTime(const CSPTime& timeSrc)
	{ m_time = timeSrc.m_time; }

CSPTime::CSPTime(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec,
	int nDST)
{
	struct tm atm;
	atm.tm_sec = nSec;
	atm.tm_min = nMin;
	atm.tm_hour = nHour;
	SP_ASSERT(nDay >= 1 && nDay <= 31);
	atm.tm_mday = nDay;
	SP_ASSERT(nMonth >= 1 && nMonth <= 12);
	atm.tm_mon = nMonth - 1;        // tm_mon is 0 based
	SP_ASSERT(nYear >= 1900);
	atm.tm_year = nYear - 1900;     // tm_year is 1900 based
	atm.tm_isdst = nDST;
	m_time = mktime(&atm);
	SP_ASSERT(m_time != -1);       // indicates an illegal input time
	if( m_time == -1 )
		m_time	=	::time(NULL);
}

CSPTime::CSPTime(WORD wDosDate, WORD wDosTime, int nDST)
{
	struct tm atm;
	atm.tm_sec = (wDosTime & ~0xFFE0) << 1;
	atm.tm_min = (wDosTime & ~0xF800) >> 5;
	atm.tm_hour = wDosTime >> 11;

	atm.tm_mday = wDosDate & ~0xFFE0;
	atm.tm_mon = ((wDosDate & ~0xFE00) >> 5) - 1;
	atm.tm_year = (wDosDate >> 9) + 80;
	atm.tm_isdst = nDST;
	m_time = mktime(&atm);
	SP_ASSERT(m_time != -1);       // indicates an illegal input time
	if( m_time == -1 )
		m_time	=	::time(NULL);
}

CSPTime::CSPTime(const SYSTEMTIME& sysTime, int nDST)
{
	if (sysTime.wYear < 1900)
	{
		time_t time0 = 0L;
		CSPTime timeT(time0);
		*this = timeT;
	}
	else
	{
		CSPTime timeT(
			(int)sysTime.wYear, (int)sysTime.wMonth, (int)sysTime.wDay,
			(int)sysTime.wHour, (int)sysTime.wMinute, (int)sysTime.wSecond,
			nDST);
		*this = timeT;
	}
}

CSPTime::CSPTime(const FILETIME& fileTime, int nDST)
{
	// first convert file time (UTC time) to local time
	FILETIME localTime;
	if (!FileTimeToLocalFileTime(&fileTime, &localTime))
	{
		m_time = 0;
		return;
	}

	// then convert that time to system time
	SYSTEMTIME sysTime;
	if (!FileTimeToSystemTime(&localTime, &sysTime))
	{
		m_time = 0;
		return;
	}

	// then convert the system time to a time_t (C-runtime local time)
	CSPTime timeT(sysTime, nDST);
	*this = timeT;
}

CSPTime PASCAL CSPTime::GetCurrentTime()
// return the current system time
{
	return CSPTime(::time(NULL));
}

DWORD CSPTime::GetTradeSecondsOfOneDay( DWORD dwMarket )
{
	return 14400;
}

DWORD CSPTime::GetStockTimeNext( DWORD dwDate, int ktype, DWORD dwYear )
{
	CSPTime	sptime;
	if( ktype == CKData::ktypeDay )
	{
		if( !sptime.FromStockTimeDay( dwDate ) )
			return -1;
		if( 6 == sptime.GetDayOfWeek() )	//	Friday
			sptime	+=	CSPTimeSpan(3,0,0,0);
		else
			sptime	+=	CSPTimeSpan(1,0,0,0);
		return sptime.ToStockTimeDay();
	}
	else if( ktype == CKData::ktypeWeek )
	{
		if( !sptime.FromStockTimeDay( dwDate ) )
			return -1;
		sptime	+=	CSPTimeSpan(7,0,0,0);
		return sptime.ToStockTimeDay();
	}
	else if( ktype == CKData::ktypeMonth )
	{
		if( !sptime.FromStockTimeDay( dwDate ) )
			return -1;
		int	nYearNew	=	sptime.GetYear();
		int nMonthNew	=	sptime.GetMonth();
		nYearNew	=	( nMonthNew >= 12 ? nYearNew+1 : nYearNew );
		nMonthNew	=	( nMonthNew >= 12 ? 1 : nMonthNew+1 );
		CSPTime	sptime2( nYearNew, nMonthNew, sptime.GetDay(), sptime.GetHour(),sptime.GetMinute(), sptime.GetSecond() );

		if( 6 == sptime2.GetDayOfWeek() )	//	Friday
			sptime2	+=	CSPTimeSpan(3,0,0,0);
		else
			sptime2	+=	CSPTimeSpan(1,0,0,0);
		return sptime2.ToStockTimeDay();
	}
	else if( ktype == CKData::ktypeMin5 )
	{
		if( !sptime.FromStockTimeMin( dwDate ) )
			return -1;
		if( sptime.GetHour() == 11 && sptime.GetMinute() >= 25 )
			sptime	+=	CSPTimeSpan(0,1,35,0);
		else if( sptime.GetHour() == 14 && sptime.GetMinute() >= 55 )
			sptime	+=	CSPTimeSpan(0,18,35,0);
		else
			sptime	+=	CSPTimeSpan(0,0,5,0);
		return sptime.ToStockTimeMin();
	}
	else if( ktype == CKData::ktypeMin15 )
	{
		if( !sptime.FromStockTimeMin( dwDate ) )
			return -1;
		if( sptime.GetHour() == 11 && sptime.GetMinute() >= 15 )
			sptime	+=	CSPTimeSpan(0,1,45,0);
		else if( sptime.GetHour() == 14 && sptime.GetMinute() >= 45 )
			sptime	+=	CSPTimeSpan(0,18,45,0);
		else
			sptime	+=	CSPTimeSpan(0,0,15,0);
		return sptime.ToStockTimeMin();
	}
	else if( ktype == CKData::ktypeMin30 )
	{
		if( !sptime.FromStockTimeMin( dwDate ) )
			return -1;
		if( sptime.GetHour() == 11 && sptime.GetMinute() >= 0 )
			sptime	+=	CSPTimeSpan(0,2,0,0);
		else if( sptime.GetHour() == 14 && sptime.GetMinute() >= 30 )
			sptime	+=	CSPTimeSpan(0,19,0,0);
		else
			sptime	+=	CSPTimeSpan(0,0,30,0);
		return sptime.ToStockTimeMin();
	}
	else if( ktype == CKData::ktypeMin60 )
	{
		if( !sptime.FromStockTimeMin( dwDate ) )
			return -1;
		if( (sptime.GetHour() == 10 && sptime.GetMinute() >= 30) || sptime.GetHour() == 11 )
			sptime	+=	CSPTimeSpan(0,2,30,0);
		else if( sptime.GetHour() == 14 && sptime.GetMinute() >= 0 )
			sptime	+=	CSPTimeSpan(0,19,30,0);
		else
			sptime	+=	CSPTimeSpan(0,1,0,0);
		return sptime.ToStockTimeMin();
	}
	else
	{
		SP_ASSERT( FALSE );
		return -1;
	}
}

time_t CSPTime::GetTimeTradeLatest( time_t tmTradeFirstToday )
{
	CSPTime	tNow	=	CSPTime::GetCurrentTime();
	CSPTime	tTradeFirstToday( tmTradeFirstToday );
	time_t	tmTradeLatest	=	-1;

	int	nYear	= tTradeFirstToday.GetYear();
	int nMonth	= tTradeFirstToday.GetMonth();
	int	nDay	= tTradeFirstToday.GetDay();

	if( tNow > tTradeFirstToday
		&& tNow.GetYear() == nYear && tNow.GetMonth() == nMonth && tNow.GetDay() == nDay )
	{
		tmTradeLatest	=	tNow.GetTime();
		if( (tNow.GetHour() == 11 && tNow.GetMinute() >= 30)
			|| tNow.GetHour() == 12 )
			tmTradeLatest	=	CSPTime(nYear,nMonth,nDay,11,30,0).GetTime();
		else if( tNow.GetHour() >= 15 )
			tmTradeLatest	=	CSPTime(nYear,nMonth,nDay,15,0,0).GetTime();
	}
	else if( tNow > tTradeFirstToday )
		tmTradeLatest	=	CSPTime(nYear,nMonth,nDay,15,0,0).GetTime();
	
	return tmTradeLatest;
}

double CSPTime::GetTimeTradeRatioOfOneDay( CSPTime tTradeLatestDay, CSPTime tNow )
{
	DWORD	dwSecOrder	=	tNow.ToStockTimeSecOrder();
	if( 0 == dwSecOrder )
		return 1;
	if( tTradeLatestDay.GetYear() == tNow.GetYear()
		&& tTradeLatestDay.GetMonth() == tNow.GetMonth()
		&& tTradeLatestDay.GetDay() == tNow.GetDay() )
		return ((double)dwSecOrder) / GetTradeSecondsOfOneDay();
	return 1;
}

time_t CSPTime::GetTradeOffsetToTime( int offset, time_t tmDay)
{
	time_t	ret = tmDay - ((tmDay+8*3600) % 86400);
	if( offset >= 0 && offset <= 120 )
		return ret + 9*3600 + (30+offset)*60;
	if( offset > 120 && offset <= 240 )
		return ret + 13*3600 + (offset-120)*60;
	return tmDay;
}

time_t CSPTime::GetLatestTradeTime( time_t tmNow )
{
	CSPTime	tNow(tmNow);

	CSPTime	tTradeLatest	=	tNow;
	if( 7 == tNow.GetDayOfWeek() )
	{	
		tNow -= CSPTimeSpan(1,0,0,0);
		tTradeLatest	=	CSPTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),15,0,0);
	}
	else if( 1 == tNow.GetDayOfWeek() )
	{
		tNow -= CSPTimeSpan(2,0,0,0);
		tTradeLatest	=	CSPTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),15,0,0);
	}
	else if( (tNow.GetHour() == 9 && tNow.GetMinute() < 25 )
		|| tNow.GetHour() < 9 )
	{
		tNow -= CSPTimeSpan(1,0,0,0);
		tTradeLatest	=	CSPTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),15,0,0);
	}
	else if( (tNow.GetHour() == 11 && tNow.GetMinute() >= 30)
		|| tNow.GetHour() == 12 )
	{
		tTradeLatest	=	CSPTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),11,30,0).GetTime();
	}
	else if( tNow.GetHour() >= 15 )
	{
		tTradeLatest	=	CSPTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),15,0,0).GetTime();
	}

	return tTradeLatest.GetTime();
}

BOOL CSPTime::InTradeTime( time_t tm, int nInflateSeconds )
{
	CSPTime	t(tm);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -