1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_tools.hxx" 26 27 #include <tools/datetime.hxx> 28 #include <rtl/math.hxx> 29 30 /************************************************************************* 31 |* 32 |* DateTime::IsBetween() 33 |* 34 |* Beschreibung DATETIME.SDW 35 |* Ersterstellung TH 18.05.92 36 |* Letzte Aenderung TH 18.05.92 37 |* 38 *************************************************************************/ 39 40 sal_Bool DateTime::IsBetween( const DateTime& rFrom, 41 const DateTime& rTo ) const 42 { 43 if ( (*this >= rFrom) && (*this <= rTo) ) 44 return sal_True; 45 else 46 return sal_False; 47 } 48 49 /************************************************************************* 50 |* 51 |* DateTime::operator >() 52 |* 53 |* Beschreibung DATETIME.SDW 54 |* Ersterstellung TH 18.05.92 55 |* Letzte Aenderung TH 18.05.92 56 |* 57 *************************************************************************/ 58 59 sal_Bool DateTime::operator >( const DateTime& rDateTime ) const 60 { 61 if ( (Date::operator>( rDateTime )) || 62 (Date::operator==( rDateTime ) && Time::operator>( rDateTime )) ) 63 return sal_True; 64 else 65 return sal_False; 66 } 67 68 /************************************************************************* 69 |* 70 |* DateTime::operator <() 71 |* 72 |* Beschreibung DATETIME.SDW 73 |* Ersterstellung TH 18.05.92 74 |* Letzte Aenderung TH 18.05.92 75 |* 76 *************************************************************************/ 77 78 sal_Bool DateTime::operator <( const DateTime& rDateTime ) const 79 { 80 if ( (Date::operator<( rDateTime )) || 81 (Date::operator==( rDateTime ) && Time::operator<( rDateTime )) ) 82 return sal_True; 83 else 84 return sal_False; 85 } 86 87 /************************************************************************* 88 |* 89 |* DateTime::operator >=() 90 |* 91 |* Beschreibung DATETIME.SDW 92 |* Ersterstellung TH 18.05.92 93 |* Letzte Aenderung TH 18.05.92 94 |* 95 *************************************************************************/ 96 97 sal_Bool DateTime::operator >=( const DateTime& rDateTime ) const 98 { 99 if ( (Date::operator>( rDateTime )) || 100 (Date::operator==( rDateTime ) && Time::operator>=( rDateTime )) ) 101 return sal_True; 102 else 103 return sal_False; 104 } 105 106 /************************************************************************* 107 |* 108 |* DateTime::operator <=() 109 |* 110 |* Beschreibung DATETIME.SDW 111 |* Ersterstellung TH 18.05.92 112 |* Letzte Aenderung TH 18.05.92 113 |* 114 *************************************************************************/ 115 116 sal_Bool DateTime::operator <=( const DateTime& rDateTime ) const 117 { 118 if ( (Date::operator<( rDateTime )) || 119 (Date::operator==( rDateTime ) && Time::operator<=( rDateTime )) ) 120 return sal_True; 121 else 122 return sal_False; 123 } 124 125 /************************************************************************* 126 |* 127 |* DateTime::GetSecFromDateTime() 128 |* 129 |* Beschreibung DATETIME.SDW 130 |* Ersterstellung TH 02.10.96 131 |* Letzte Aenderung TH 02.10.96 132 |* 133 *************************************************************************/ 134 135 long DateTime::GetSecFromDateTime( const Date& rDate ) const 136 { 137 if ( Date::operator<( rDate ) ) 138 return 0; 139 else 140 { 141 long nSec = Date( *this ) - rDate; 142 nSec *= 24UL*60*60; 143 long nHour = GetHour(); 144 long nMin = GetMin(); 145 nSec += (nHour*3600)+(nMin*60)+GetSec(); 146 return nSec; 147 } 148 } 149 150 /************************************************************************* 151 |* 152 |* DateTime::GetSecFromDateTime() 153 |* 154 |* Beschreibung DATETIME.SDW 155 |* Ersterstellung TH 02.10.96 156 |* Letzte Aenderung TH 02.10.96 157 |* 158 *************************************************************************/ 159 160 void DateTime::MakeDateTimeFromSec( const Date& rDate, sal_uIntPtr nSec ) 161 { 162 long nDays = nSec / (24UL*60*60); 163 ((Date*)this)->operator=( rDate ); 164 nSec -= nDays * (24UL*60*60); 165 sal_uInt16 nMin = (sal_uInt16)(nSec / 60); 166 nSec -= nMin * 60; 167 ((Time*)this)->operator=( Time( 0, nMin, (sal_uInt16)nSec ) ); 168 operator+=( nDays ); 169 } 170 171 /************************************************************************* 172 |* 173 |* DateTime::operator +=() 174 |* 175 |* Beschreibung DATETIME.SDW 176 |* Ersterstellung TH 02.10.96 177 |* Letzte Aenderung TH 02.10.96 178 |* 179 *************************************************************************/ 180 181 DateTime& DateTime::operator +=( const Time& rTime ) 182 { 183 Time aTime = *this; 184 aTime += rTime; 185 sal_uInt16 nHours = aTime.GetHour(); 186 if ( aTime.GetTime() > 0 ) 187 { 188 while ( nHours >= 24 ) 189 { 190 Date::operator++(); 191 nHours -= 24; 192 } 193 aTime.SetHour( nHours ); 194 } 195 else if ( aTime.GetTime() != 0 ) 196 { 197 while ( nHours >= 24 ) 198 { 199 Date::operator--(); 200 nHours -= 24; 201 } 202 Date::operator--(); 203 aTime = Time( 24, 0, 0 )+aTime; 204 } 205 Time::operator=( aTime ); 206 207 return *this; 208 } 209 210 /************************************************************************* 211 |* 212 |* DateTime::operator -=() 213 |* 214 |* Beschreibung DATETIME.SDW 215 |* Ersterstellung TH 02.10.96 216 |* Letzte Aenderung TH 02.10.96 217 |* 218 *************************************************************************/ 219 220 DateTime& DateTime::operator -=( const Time& rTime ) 221 { 222 Time aTime = *this; 223 aTime -= rTime; 224 sal_uInt16 nHours = aTime.GetHour(); 225 if ( aTime.GetTime() > 0 ) 226 { 227 while ( nHours >= 24 ) 228 { 229 Date::operator++(); 230 nHours -= 24; 231 } 232 aTime.SetHour( nHours ); 233 } 234 else if ( aTime.GetTime() != 0 ) 235 { 236 while ( nHours >= 24 ) 237 { 238 Date::operator--(); 239 nHours -= 24; 240 } 241 Date::operator--(); 242 aTime = Time( 24, 0, 0 )+aTime; 243 } 244 Time::operator=( aTime ); 245 246 return *this; 247 } 248 249 /************************************************************************* 250 |* 251 |* DateTime::operator+() 252 |* 253 |* Beschreibung DATETIME.SDW 254 |* Ersterstellung TH 02.10.96 255 |* Letzte Aenderung TH 02.10.96 256 |* 257 *************************************************************************/ 258 259 DateTime operator +( const DateTime& rDateTime, long nDays ) 260 { 261 DateTime aDateTime( rDateTime ); 262 aDateTime += nDays; 263 return aDateTime; 264 } 265 266 /************************************************************************* 267 |* 268 |* DateTime::operator-() 269 |* 270 |* Beschreibung DATETIME.SDW 271 |* Ersterstellung TH 02.10.96 272 |* Letzte Aenderung TH 02.10.96 273 |* 274 *************************************************************************/ 275 276 DateTime operator -( const DateTime& rDateTime, long nDays ) 277 { 278 DateTime aDateTime( rDateTime ); 279 aDateTime -= nDays; 280 return aDateTime; 281 } 282 283 /************************************************************************* 284 |* 285 |* DateTime::operator+() 286 |* 287 |* Beschreibung DATETIME.SDW 288 |* Ersterstellung TH 02.10.96 289 |* Letzte Aenderung TH 02.10.96 290 |* 291 *************************************************************************/ 292 293 DateTime operator +( const DateTime& rDateTime, const Time& rTime ) 294 { 295 DateTime aDateTime( rDateTime ); 296 aDateTime += rTime; 297 return aDateTime; 298 } 299 300 /************************************************************************* 301 |* 302 |* DateTime::operator-() 303 |* 304 |* Beschreibung DATETIME.SDW 305 |* Ersterstellung TH 02.10.96 306 |* Letzte Aenderung TH 02.10.96 307 |* 308 *************************************************************************/ 309 310 DateTime operator -( const DateTime& rDateTime, const Time& rTime ) 311 { 312 DateTime aDateTime( rDateTime ); 313 aDateTime -= rTime; 314 return aDateTime; 315 } 316 317 /************************************************************************* 318 |* 319 |* DateTime::operator +=( double ) 320 |* 321 *************************************************************************/ 322 323 DateTime& DateTime::operator +=( double fTimeInDays ) 324 { 325 double fInt, fFrac; 326 if ( fTimeInDays < 0.0 ) 327 { 328 fInt = ::rtl::math::approxCeil( fTimeInDays ); 329 fFrac = fInt <= fTimeInDays ? 0.0 : fTimeInDays - fInt; 330 } 331 else 332 { 333 fInt = ::rtl::math::approxFloor( fTimeInDays ); 334 fFrac = fInt >= fTimeInDays ? 0.0 : fTimeInDays - fInt; 335 } 336 Date::operator+=( long(fInt) ); // full days 337 if ( fFrac ) 338 { 339 Time aTime(0); // default ctor calls system time, we don't need that 340 fFrac *= 24UL * 60 * 60 * 1000; // time expressed in milliseconds 341 aTime.MakeTimeFromMS( long(fFrac) ); // method handles negative ms 342 operator+=( aTime ); 343 } 344 return *this; 345 } 346 347 /************************************************************************* 348 |* 349 |* DateTime::operator +( double ) 350 |* 351 *************************************************************************/ 352 353 DateTime operator +( const DateTime& rDateTime, double fTimeInDays ) 354 { 355 DateTime aDateTime( rDateTime ); 356 aDateTime += fTimeInDays; 357 return aDateTime; 358 } 359 360 /************************************************************************* 361 |* 362 |* DateTime::operator -() 363 |* 364 *************************************************************************/ 365 366 double operator -( const DateTime& rDateTime1, const DateTime& rDateTime2 ) 367 { 368 long nDays = (const Date&) rDateTime1 - (const Date&) rDateTime2; 369 long nTime = rDateTime1.GetMSFromTime() - rDateTime2.GetMSFromTime(); 370 if ( nTime ) 371 { 372 double fTime = double(nTime); 373 fTime /= 24UL * 60 * 60 * 1000; // convert from milliseconds to fraction 374 if ( nDays < 0 && fTime > 0.0 ) 375 fTime = 1.0 - fTime; 376 return double(nDays) + fTime; 377 } 378 return double(nDays); 379 } 380 381 void DateTime::GetWin32FileDateTime( sal_uInt32 & rLower, sal_uInt32 & rUpper ) 382 { 383 const sal_Int64 a100nPerSecond = SAL_CONST_INT64( 10000000 ); 384 const sal_Int64 a100nPerDay = a100nPerSecond * sal_Int64( 60 * 60 * 24 ); 385 386 sal_Int64 nYears = GetYear() - 1601; 387 sal_Int64 nDays = 388 nYears * 365 + 389 nYears / 4 - nYears / 100 + nYears / 400 + 390 GetDayOfYear() - 1; 391 392 sal_Int64 aTime = 393 a100nPerDay * nDays + 394 a100nPerSecond * ( 395 sal_Int64( GetSec() ) + 396 60 * sal_Int64( GetMin() ) + 397 60 * 60 * sal_Int64( GetHour() ) ); 398 399 rLower = sal_uInt32( aTime % SAL_CONST_UINT64( 0x100000000 ) ); 400 rUpper = sal_uInt32( aTime / SAL_CONST_UINT64( 0x100000000 ) ); 401 } 402 403 DateTime DateTime::CreateFromWin32FileDateTime( const sal_uInt32 & rLower, const sal_uInt32 & rUpper ) 404 { 405 const sal_Int64 a100nPerSecond = SAL_CONST_INT64( 10000000 ); 406 const sal_Int64 a100nPerDay = a100nPerSecond * sal_Int64( 60 * 60 * 24 ); 407 408 sal_Int64 aTime = sal_Int64( 409 sal_uInt64( rUpper ) * SAL_CONST_UINT64( 0x100000000 ) + 410 sal_uInt64( rLower ) ); 411 412 sal_Int64 nDays = aTime / a100nPerDay; 413 sal_Int64 nYears = 414 ( nDays - 415 ( nDays / ( 4 * 365 ) ) + 416 ( nDays / ( 100 * 365 ) ) - 417 ( nDays / ( 400 * 365 ) ) ) / 365; 418 nDays -= nYears * 365 + nYears / 4 - nYears / 100 + nYears / 400; 419 420 sal_uInt16 nMonths = 0; 421 for( sal_Int64 nDaysCount = nDays; nDaysCount >= 0; ) 422 { 423 nDays = nDaysCount; 424 nMonths ++; 425 nDaysCount -= Date( 426 1, nMonths, sal::static_int_cast< sal_uInt16 >(1601 + nYears) ). 427 GetDaysInMonth(); 428 } 429 430 Date _aDate( 431 (sal_uInt16)( nDays + 1 ), nMonths, 432 sal::static_int_cast< sal_uInt16 >(nYears + 1601) ); 433 Time _aTime( sal_uIntPtr( ( aTime / ( a100nPerSecond * 60 * 60 ) ) % sal_Int64( 24 ) ), 434 sal_uIntPtr( ( aTime / ( a100nPerSecond * 60 ) ) % sal_Int64( 60 ) ), 435 sal_uIntPtr( ( aTime / ( a100nPerSecond ) ) % sal_Int64( 60 ) ) ); 436 437 return DateTime( _aDate, _aTime ); 438 } 439