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

📄 dt.cpp

📁 简单的ODBC访问接口
💻 CPP
📖 第 1 页 / 共 2 页
字号:
         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 + -