📄 dt.cpp
字号:
os << dec << setfill( '0' ) << setw( 4 ) << setiosflags( ios::right ) << m_year;
s = os.str();
//sprintf( ach, "%02d-%02d-%04d", m_month, m_day, m_year );
//s = ach;
}
break;
default:
s = "??-??-????";
}
_s = s;
return _s.c_str(); // alive as long as the object is
}
void TDt::SetFormat( int format )
{
m_nDisplayFormat = format;
}
//
// Assignment methods
//
TDt& TDt::Set() // Get today's date
{
#if _MSC_VER < 1100
/*
time_t osBinaryTime; // C run-time time( defined in <time.h> )
time( &osBinaryTime ) ; // Get the current time from the
// operating system.
CTime time3( osBinaryTime ); // CTime from C run-time time
return Set( osBinaryTime.Format( "%m/%d/%y" ) );
*/
dosdate_t ddt;
_dos_getdate( &ddt );
return Set( ddt.month, ddt.day, ddt.year );
#else
SYSTEMTIME st;
GetLocalTime( &st );
return Set( st.wMonth, st.wDay, st.wYear );
#endif
}
// Possible formats--
// mm/dd/yy
// mm/dd/yyyy
// mm/d/yy
// m/d/yy
// mddyy
// mmddyy
// mmddyyyy
// *also with dashes "-"
TDt& TDt::Set( const char* a_p )
{
if ( a_p == NULL || a_p[0] == 0 ) // null or zero string
return Set( 0L ); // default to null
int len = strlen( a_p );
// check for ODBC timestamp 'yyyy-mm-dd' or 'yyyy-mm-dd 00:00:00'
//if ( len == 10 )
if ( a_p[4] == '-' && a_p[7] == '-' )
return Set( atoi( &( a_p[5] ) ), atoi( &( a_p[8] ) ), atoi( a_p ) );
// test if the user entered mmddyy
bool bIsNumeric = TRUE;
for ( int n=0; n < len; n++ )
if ( a_p[n] < '0' || a_p[n] > '9' )
{
bIsNumeric = false;
break;
}
char p[16];
strncpy( p, a_p, sizeof( p ) );
if ( bIsNumeric &&( len == 6 || len == 8 ) ) // 'mm-dd-yy' or 'mm-dd-yyyy'
{
int Year = atoi( &( p[6] ) );
p[5] = 0;
int Day = atoi( &( p[3] ) );
p[2] = 0;
int Month = atoi( p );
return Set( Month, Day, Get4DigitYear( Year ) );
}
for ( n=0; n < len; n++ )
if ( p[n] == '-' )
p[n] = '/';
int month = atoi( p );
if ( month == 0 || month < 1 || month > 12 ) // somethings wrong
return Set(); // default to today
char* i = strchr( p, '/' );
if ( i == NULL )
return Set();
int day = atoi( ++i );
if ( day < 1 || day > 31 )
{
Set();
return Set( month, Day(), Year() ); // use the month arg
}
i = strchr( i, '/' );
if ( i == NULL )
return Set();
int year = atoi( ++i );
//if ( year == 0 )
//{
// Set();
// return Set( month, day, Year() );
//}
return Set( month, day, Get4DigitYear( year ) );
}
/*
#ifndef WIN32
TDt& TDt::Set( const dosdate_t& ddt )
{
return Set( ddt.month, ddt.day, ddt.year );
}
#endif
*/
// Convert mdy into a number that is the days since 1/1/0001 a.d.
TDt& TDt::Set( int am, int ad, int ay )
{
m_month = am;
m_day = ad;
m_year = ay;
if ( m_month && m_day ) // non zero
Get4DigitYear( ay );
return *this;
}
TDt& TDt::Set( long j )
{
GetMDY( m_month, m_day, m_year, j );
return *this;
}
TDt& TDt::Set( TDt& dt )
{
m_month = dt.Month();
m_day = dt.Day();
m_year = dt.Year();
return *this;
}
TDt& TDt::Set( const TDt& dt )
{
#if _MSC_VER < 1100
TDt& ndt = ( TDt& )( dt );
m_month = ndt.Month();
m_day = ndt.Day();
m_year = ndt.Year();
return *this;
#else
TDt& ndt = const_cast<TDt&>( dt );
m_month = ndt.Month();
m_day = ndt.Day();
m_year = ndt.Year();
return *this;
#endif
}
//
// Miscellaneous Routines
//
int TDt::IsLeap()
{
return( ( m_year >= 1582 ) ?
( m_year % 4 == 0 && m_year % 100 != 0 || m_year % 400 == 0 ):
( m_year % 4 == 0 ) );
}
int TDt::Day()
{
return m_day;
}
int TDt::Month()
{
return m_month;
}
int TDt::Year()
{
return m_year;
}
TDt& TDt::SetBOM()
{
Set( Month(), 1, Year() );
return *this;
}
TDt& TDt::SetEOM()
{
AddMonths( 1 );
SetBOM();
( *this )--;
return *this;
}
TDt& TDt::SetBOY()
{
Set( 1, 1, Year() );
return *this;
}
TDt& TDt::SetEOY()
{
Set( 12, 31, Year() );
return *this;
}
// This is not an accurate idea( ????? )
int TDt::YYMM()
{ // integer yymm ( 9201 )
int nY = Year();
if ( nY > 1999 ) {
nY -= 2000;
} else if ( nY > 1900 ) {
nY -= 1900;
}
return( nY * 100 ) + Month();
}
int TDt::DOY()
{
TDt temp( 1, 1, Year() );
return( int )( Julian() - temp.Julian() + 1 );
}
int TDt::DaysInMonth()
{
static int GauDays[] = { 31, 28, 31, 30,
31, 30, 31, 31, 30, 31, 30, 31 };
return GauDays[Month()-1] +( Month()==2 && IsLeap() );
}
int TDt::FirstDOM()
{
TDt dt( Month(), 1, Year() );
int i = dt.DOW() + 1;
return i;
}
int TDt::DOW()
{
return( int )( ( Julian() % 7 ) ); // Sun == 0 .. Sat == 6
}
// 3rd Wednesday etc...
int TDt::DOM()
{
return( ( Day() - 1 ) / 7 ) + 1;
}
int TDt::WOM()
{
// Abs day includes the days from previous month that fills up
// the begin. of the week.
int nAbsDay = Day() + FirstDOM()-1;
return( nAbsDay-( DOW() ) )/7 + 1;
}
int TDt::WOY()
{
TDt dt( 1, 1, Year() );
return( int )( (( Julian() - dt.Julian() + 1 ) / 7 ) + 1 );
}
TDt& TDt::AddWeeks( int nCount )
{
long j = GetJulian( m_month, m_day, m_year );
j += ( nCount * 7 );
GetMDY( m_month, m_day, m_year, j );
return *this;
}
TDt& TDt::AddMonths( int nCount )
{
m_month += nCount;
while ( m_month < 1 ) {
m_month += 12;
m_year--;
}
while ( m_month > 12 ) {
m_month -= 12;
m_year++;
}
return *this;
}
// Possible bug on leap year 2-29-??
TDt& TDt::AddYears( int nCount )
{
int m = Month();
int d = Day();
int y = Year() + nCount;
Set( m, d, y );
return *this;
}
const char* TDt::DayName()
{
return Format( TDt::DAY );
}
const char* TDt::MonthName()
{
return Format( TDt::MONTH );
}
// d1 - d2 = result
int TDt::DifferenceInYears( long d1, long d2 )
{
TDt dt1 = d1;
TDt dt2 = d2;
return dt1.Year() - dt2.Year();
}
// d1 - d2 = result
int TDt::DifferenceInMonths( long d1, long d2 )
{
TDt dt1 = d1;
TDt dt2 = d2;
double dbl1 = ( ( dt1.Year() * 12 ) + dt1.Month() );
double dbl2 = ( ( dt2.Year() * 12 ) + dt2.Month() );
double dbl = dbl1 - dbl2;
int n = ( int )dbl;
return n;
}
int TDt::Age()
{
if ( Julian() == 0 )
return 0;
TDt dtToday;
int nAge = ( int )( dtToday.Julian() - Julian() );
nAge = nAge / 365;
return nAge;
}
void TDt::GetMDY( int& nm, int &nd, int& ny, long jul )
{
if ( jul == 0 )
{
nm = 0;
nd = 0;
ny = 0;
return;
}
double m, d, y, dayno;
dayno = jul;
dayno += 443;
y = floor( ( dayno - 122.1 ) / 365.25 );
m = floor( ( dayno - floor( 365.25 * y ) ) / 30.6001 );
d = dayno - floor( 365.25 * y ) - floor( 30.6001 * m );
m = ( m < 14 ) ? m - 1 : m - 13;
y = ( m < 3 ) ? y + 1 : y;
nm = ( int )m; // verify this; use new casting methods
nd = ( int )d;
ny = ( int )y;
}
long TDt::GetJulian( int am, int ad, int ay )
{
double m, y;
long jul;
if ( am == 0 && ad == 0 && ay == 0 )
return 0L;
y = Get4DigitYear( ay );
if ( am > 2 ) {
m = am + 1.0;
y = ay;
} else {
m = am + 13.0;
y = ay - 1;
}
jul = ( long )( floor( 365.25 *( y ) ) + floor( 30.6001 * m ) + ad );
jul -= 443;
return jul;
}
int TDt::Get4DigitYear( int yy )
{
// Use the Oracle convention breaking on 2049/1950
if ( yy >= 0 && yy < 50 ) {
yy += 2000;
} else if ( yy >= 50 && yy <= 99 ) {
yy += 1900;
}
return yy;
}
bool TDt::IsNull()
{
return m_month == 0 && m_day == 0 && m_year == 0;
}
// 1st 2nd 3rd 4th 20th 21st 22nd 23rd 24th 30th 31st
const char* TDt::GetNumberSuffix( int day )
{
static string s;
if ( day == 1 || day == 21 || day == 31 )
s = "st";
else if ( day == 2 || day == 22 )
s = "nd";
else if ( day == 3 || day == 23 )
s = "rd";
else
s = "th";
return s.c_str();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -