📄 dt.cpp
字号:
#include "dt.h"
#include <windows.h>
#include <sstream>
#include <iomanip>
using namespace std;
#include <math.h>
#include <time.h>
const int TDt::FULL = 1;
const int TDt::EUROPEAN = 2;
const int TDt::MMDDYYYY = 3;
const int TDt::MMMDDD = 4;
const int TDt::DDDW = 5;
const int TDt::YYYYMMDD = 6;
const int TDt::CRWFORMULA = 7;
const int TDt::LETTER = 8;
const int TDt::ODBC = 9;
const int TDt::MMMYYYY = 10;
const int TDt::DAY = 11;
const int TDt::MONTH = 12;
const int TDt::ORACLE = 13;
const int TDt::DDMMMYY = 14;
const int TDt::DD = 15;
const int TDt::MM = 16;
const int TDt::YYYY = 17;
const int TDt::DTH = 18;
const int TDt::D = 19;
const int TDt::M = 20;
int TDt::m_nDisplayFormat = TDt::MMDDYYYY;
// Constructors
TDt::TDt()
{ // Set to today
Set();
SetFormat( TDt::MMDDYYYY );
}
TDt::TDt( long j )
{
Set( j );
SetFormat( TDt::MMDDYYYY );
}
TDt::TDt( int m, int d, int y )
{
Set( m, d, y );
SetFormat( TDt::MMDDYYYY );
}
TDt::TDt( const char *lpszDate )
{
Set( lpszDate );
SetFormat( TDt::MMDDYYYY );
}
TDt::TDt( TDt& dt )
{
Set( dt );
SetFormat( TDt::MMDDYYYY );
}
//
// Magic conversion routines
//
long TDt::Julian()
{
return GetJulian( m_month, m_day, m_year );
}
//
// Assignment operators
//
TDt& TDt::operator = ( const TDt& dt )
{
return Set( dt );
}
TDt& TDt::operator = ( const char* p )
{
return Set( p );
}
TDt& TDt::operator = ( long l )
{
return Set( l );
}
//
// Incremental operators
//
TDt& TDt::operator += ( int i )
{
long j = GetJulian( m_month, m_day, m_year );
j += i;
GetMDY( m_month, m_day, m_year, j );
return *this;
}
TDt& TDt::operator -= ( int i )
{
long j = GetJulian( m_month, m_day, m_year );
j -= i;
GetMDY( m_month, m_day, m_year, j );
return *this;
}
TDt& TDt::operator ++()
{
long j = GetJulian( m_month, m_day, m_year );
j++;
GetMDY( m_month, m_day, m_year, j );
return *this;
}
TDt TDt::operator ++( int )
{
long j = GetJulian( m_month, m_day, m_year );
j++;
GetMDY( m_month, m_day, m_year, j );
return *this;
}
TDt& TDt::operator --()
{
long j = GetJulian( m_month, m_day, m_year );
j--;
GetMDY( m_month, m_day, m_year, j );
return *this;
}
TDt TDt::operator --( int )
{
long j = GetJulian( m_month, m_day, m_year );
j--;
GetMDY( m_month, m_day, m_year, j );
return *this;
}
//
// comparison operators
//
bool operator <( long l, TDt& dt2 )
{
return l < dt2.Julian();
}
bool operator <= ( long l, TDt& dt2 )
{
return( l == dt2.Julian() ) ||( l < dt2.Julian() );
}
bool operator >( long l, TDt& dt2 )
{
return( l > dt2.Julian() );
}
bool operator >= ( long l, TDt& dt2 )
{
return( l == dt2.Julian() ) ||( l > dt2.Julian() );
}
bool operator == ( long l, TDt& dt2 )
{
return l == dt2.Julian();
}
bool operator != ( long l, TDt& dt2 )
{
return l != dt2.Julian();
}
//
// Ostream operations
//
/*
ostream& operator <<( ostream &os, TDt& dt )
{
dt.Format();
os << dt.m_dsDate;
return os;
}
ostream& operator <<( ostream &os, const TDt& dt )
{
TDt& ndt = const_cast<TDt&>( dt );
ndt.Format();
os << ndt.m_dsDate;
return os;
}
*/
//
// Format routine
//
const char* TDt::Format( const char* fs )
{
string s;
char ach[128];
tm time;
memset( &time, 0, sizeof( tm ) );
time.tm_year = m_year - 1900;
time.tm_mon = m_month - 1; // jan==0
time.tm_mday = m_day;
//#pragma MESSAGE( Add day of week week of year etc to this )
strftime( ach, sizeof( ach ), fs, &time );
ach[sizeof( ach )-1] = 0; // insurance
s = ach;
// add st nd rd th where appropriate
// change case also?
_s = s;
return _s.c_str();
}
void TDt::Format( char* ach, int size, int a_nDisplayFormat )
{
string s = Format( a_nDisplayFormat );
strncpy( ach, s.c_str(), size-1 );
ach[size-1] = 0; // buffer safety
}
const char* TDt::Format( int a_nDisplayFormat )
{
//char ach[255];
string s;
//
// this stuff needs to be moved into a resource area( bug )
//
static const char *DayName[] = {"Sunday", "Monday",
"Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} ;
const char *MonthName[] = {"January","February","March","April","May",
"June","July","August","September","October","November","December"};
int nDisplayFormat;
if ( a_nDisplayFormat == -1 )
nDisplayFormat = m_nDisplayFormat;
else
nDisplayFormat = a_nDisplayFormat;
switch ( nDisplayFormat ) {
case TDt::DD:
{
ostringstream os;
os << dec << setfill( '0' ) << setw( 2 ) << setiosflags( ios::right ) << m_day;
s = os.str();
//sprintf( ach, "%02d", m_day );
//s = ach;
}
break;
case TDt::D:
{
ostringstream os;
os << dec << m_day;
s = os.str();
//sprintf( ach, "%d", m_day );
//s = ach;
}
break;
case TDt::MM:
{
ostringstream os;
os << dec << setfill( '0' ) << setw( 2 ) << setiosflags( ios::right ) << m_month;
s = os.str();
//sprintf( ach, "%02d", m_month );
//s = ach;
}
break;
case TDt::M:
{
ostringstream os;
os << dec << m_month;
s = os.str();
//sprintf( ach, "%d", m_month );
//s = ach;
}
break;
case TDt::YYYY:
{
ostringstream os;
os << dec << m_year;
s = os.str();
//sprintf( ach, "%04d", m_year );
//s = ach;
}
break;
case TDt::DTH:
s = Format( TDt::D );
s += GetNumberSuffix( m_day );
break;
case TDt::DAY:
if ( ! IsNull() )
s = DayName[DOW()];
break;
case TDt::MONTH:
if ( ! IsNull() )
s = MonthName[Month()-1];
break;
case TDt::FULL: // Monday, January 2nd, 1998
if ( ! IsNull() )
{
string csSuffix = GetNumberSuffix( Day() );
string csDayName = DayName[DOW()];
string csMonthName = MonthName[Month()-1];
s = csDayName;
s += ", ";
s += csMonthName;
s += " ";
s += Format( TDt::D );
s += csSuffix;
s += ", ";
s += Format( TDt::YYYY );
}
break;
case TDt::LETTER: // March 23rd, 2001
if ( ! IsNull() )
{
string csSuffix = GetNumberSuffix( Day() );
string csMonthName = MonthName[Month()-1];
s += csMonthName;
s += " ";
s += Format( TDt::D );
s += csSuffix;
s += ", ";
s += Format( TDt::YYYY );
}
break;
case TDt::EUROPEAN: // 23 March, 2001
if ( ! IsNull() )
{
string csMonthName = MonthName[Month()-1];
s += Format( TDt::D );
s += " ";
s += csMonthName;
s += " ";
s += Format( TDt::YYYY );
}
break;
case TDt::MMMYYYY: // March 1999
if ( ! IsNull() )
{
string csMonthName = MonthName[Month()-1];
s += csMonthName;
s += " ";
s += Format( TDt::YYYY );
}
break;
case TDt::ORACLE: // 02-JUL-2001
if ( ! IsNull() )
{
string csMonthName = MonthName[Month()-1];
csMonthName.erase( 3, 50 );
s += Format( TDt::DD );
s += "-";
s += csMonthName;
s += "-";
s += Format( TDt::YYYY );
}
break;
case TDt::ODBC:
if ( ! IsNull() )
{
ostringstream os;
os << "{d'";
os << dec << setfill( '0' ) << setw( 4 ) << setiosflags( ios::right ) << m_year;
os << "-";
os << dec << setfill( '0' ) << setw( 2 ) << setiosflags( ios::right ) << m_month;
os << "-";
os << dec << setfill( '0' ) << setw( 2 ) << setiosflags( ios::right ) << m_day;
os << "'}";
s = os.str();
//sprintf( ach, "{d'%04d-%02d-%02d'}", m_year, m_month, m_day );
//s = ach;
}
break;
case TDt::CRWFORMULA:
if ( ! IsNull() )
{
ostringstream os;
os << "date( ";
os << dec << setfill( '0' ) << setw( 4 ) << setiosflags( ios::right ) << m_year;
os << ",";
os << dec << setfill( '0' ) << setw( 2 ) << setiosflags( ios::right ) << m_month;
os << ",";
os << dec << setfill( '0' ) << setw( 2 ) << setiosflags( ios::right ) << m_day;
os << " )";
s = os.str();
//sprintf( ach, "date( %04d,%02d,%02d )", m_year, m_month, m_day );
//s = ach;
}
break;
case TDt::YYYYMMDD:
if ( ! IsNull() )
{
ostringstream os;
os << dec << setfill( '0' ) << setw( 4 ) << setiosflags( ios::right ) << m_year;
os << "-";
os << dec << setfill( '0' ) << setw( 2 ) << setiosflags( ios::right ) << m_month;
os << "-";
os << dec << setfill( '0' ) << setw( 2 ) << setiosflags( ios::right ) << m_day;
s = os.str();
//sprintf( ach, "%04d-%02d-%02d", m_year, m_month, m_day );
//s = ach;
}
break;
case TDt::MMDDYYYY:
if ( ! IsNull() )
{
ostringstream os;
os << dec << setfill( '0' ) << setw( 2 ) << setiosflags( ios::right ) << m_month;
os << "-";
os << dec << setfill( '0' ) << setw( 2 ) << setiosflags( ios::right ) << m_day;
os << "-";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -