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
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
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