Main Page   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

Date.cpp

Go to the documentation of this file.
00001 
00059 #include "Date.h"
00060 #include <time.h>
00061 
00072 long Date::YmdToJd( const int iYear, const int iMonth, const int iDay )
00073 {
00074     long jul_day;
00075 
00076 #ifndef JULDATE_USE_ALTERNATE_METHOD
00077 
00078     int a,b;
00079     int year = iYear, month = iMonth, day = iDay;
00080     float year_corr;
00081 
00082     if ( year < 0 )
00083         year++;
00084     year_corr = ( year > 0 ? 0.0 : 0.75 );
00085     if ( month <= 2 )
00086     {
00087         year--;
00088         month += 12;
00089     }
00090     b = 0;
00091     if ( year * 10000.0 + month * 100.0 + day >= 15821015.0 )
00092     {
00093         a = year / 100;
00094         b = 2 - a + a / 4;
00095     }
00096     jul_day = (long) ( 365.25 * year - year_corr ) +
00097               (long) ( 30.6001 * ( month + 1 ) ) + day + 1720995L + b;
00098 
00099 #else
00100 
00101     long lmonth = (long) iMonth, lday = (long) iDay, lyear = (long) iYear;
00102 
00103     // Adjust BC years
00104     if ( lyear < 0 )
00105         lyear++;
00106 
00107     jul_day = lday - 32075L +
00108         1461L * ( lyear + 4800L + ( lmonth - 14L ) / 12L ) / 4L +
00109         367L * ( lmonth - 2L - ( lmonth - 14L ) / 12L * 12L ) / 12L -
00110         3L * ( ( lyear + 4900L + ( lmonth - 14L ) / 12L ) / 100L ) / 4L;
00111 
00112 #endif
00113 
00114     return jul_day;
00115 }
00116 
00117 
00129 void Date::JdToYmd( const long lJD, int *piYear, int *piMonth, int *piDay )
00130 {
00131 #ifndef JULDATE_USE_ALTERNATE_METHOD
00132 
00133     long a, b, c, d, e, z, alpha;
00134 
00135     z = lJD;
00136     if ( z < 2299161L )
00137         a = z;
00138     else
00139     {
00140         alpha = (long) ( ( z - 1867216.25 ) / 36524.25 );
00141         a = z + 1 + alpha - alpha / 4;
00142     }
00143     b = a + 1524;
00144     c = (long) ( ( b - 122.1 ) / 365.25 );
00145     d = (long) ( 365.25 * c );
00146     e = (long) ( ( b - d ) / 30.6001 );
00147     *piDay = (int) b - d - (long) ( 30.6001 * e );
00148     *piMonth = (int) ( e < 13.5 ) ? e - 1 : e - 13;
00149     *piYear = (int) ( *piMonth > 2.5 ) ? ( c - 4716 ) : c - 4715;
00150     if ( *piYear <= 0 )
00151         *piYear -= 1;
00152 
00153 #else
00154 
00155     long t1, t2, yr, mo;
00156 
00157     t1 = lJD + 68569L;
00158     t2 = 4L * t1 / 146097L;
00159     t1 = t1 - ( 146097L * t2 + 3L ) / 4L;
00160     yr = 4000L * ( t1 + 1L ) / 1461001L;
00161     t1 = t1 - 1461L * yr / 4L + 31L;
00162     mo = 80L * t1 / 2447L;
00163     *piDay = (int) ( t1 - 2447L * mo / 80L );
00164     t1 = mo / 11L;
00165     *piMonth = (int) ( mo + 2L - 12L * t1 );
00166     *piYear = (int) ( 100L * ( t2 - 49L ) + yr + t1 );
00167 
00168     // Correct for BC years
00169     if ( *piYear <= 0 )
00170         *piYear -= 1;
00171 
00172 #endif
00173 
00174     return;
00175 }
00176 
00186 void Date::ToString( char *szBuffer ) const
00187 {
00188     int i;
00189     long Temp;
00190 
00191     Temp = lJulianDay;
00192     if ( Temp < 0L )
00193         szBuffer[0] = '-';
00194     else
00195         szBuffer[0] = '+';
00196     szBuffer[11] = '\0';
00197     for ( i = 10; i > 0; i-- )
00198     {
00199         szBuffer[i] = ( Temp % 10L ) + '0';
00200         Temp /= 10;
00201     }
00202 
00203     return;
00204 }
00205 
00211 int Date::DayOfYear( void ) const
00212 {
00213     int y, m, d;
00214     long soy;
00215 
00216     JdToYmd( lJulianDay, &y, &m, &d );
00217     soy = YmdToJd( y, 1, 1 );
00218     return (int) ( lJulianDay - soy + 1 );
00219 }
00220 
00226 time_t Date::ToSysTime( void ) const
00227 {
00228     struct tm tmRep;
00229     int y, m, d;
00230     time_t t;
00231     
00232     JdToYmd( lJulianDay, &y, &m, &d );
00233     if ( y < 1970 )
00234     {
00235         y = 70;
00236         m = 1;
00237         d = 1;
00238     }
00239     tmRep.tm_year = y - 1900 ;
00240     tmRep.tm_mon = m-1;
00241     tmRep.tm_mday = d;
00242     tmRep.tm_hour = 0;
00243     tmRep.tm_min = 0;
00244     tmRep.tm_sec = 0;
00245     tmRep.tm_isdst = 0;
00246     
00247     t = mktime( &tmRep );
00248     return t;
00249 }
00250 
00251 // end-of-file

Generated on Mon Jan 27 21:09:53 2003 for Date Class by doxygen1.3-rc2