Orb/Doxygen/qtools/qdatetime.cpp
changeset 0 42188c7ea2d9
child 4 468f4c8d3d5b
equal deleted inserted replaced
-1:000000000000 0:42188c7ea2d9
       
     1 /****************************************************************************
       
     2 ** 
       
     3 **
       
     4 ** Implementation of date and time classes
       
     5 **
       
     6 ** Created : 940124
       
     7 **
       
     8 ** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
       
     9 **
       
    10 ** This file is part of the tools module of the Qt GUI Toolkit.
       
    11 **
       
    12 ** This file may be distributed under the terms of the Q Public License
       
    13 ** as defined by Trolltech AS of Norway and appearing in the file
       
    14 ** LICENSE.QPL included in the packaging of this file.
       
    15 **
       
    16 ** This file may be distributed and/or modified under the terms of the
       
    17 ** GNU General Public License version 2 as published by the Free Software
       
    18 ** Foundation and appearing in the file LICENSE.GPL included in the
       
    19 ** packaging of this file.
       
    20 **
       
    21 ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
       
    22 ** licenses may use this file in accordance with the Qt Commercial License
       
    23 ** Agreement provided with the Software.
       
    24 **
       
    25 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
       
    26 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
       
    27 **
       
    28 ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
       
    29 **   information about Qt Commercial License Agreements.
       
    30 ** See http://www.trolltech.com/qpl/ for QPL licensing information.
       
    31 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
       
    32 **
       
    33 ** Contact info@trolltech.com if any conditions of this licensing are
       
    34 ** not clear to you.
       
    35 **
       
    36 **********************************************************************/
       
    37 
       
    38 #define gettimeofday	__hide_gettimeofday
       
    39 #include "qdatetime.h"
       
    40 #include "qdatastream.h"
       
    41 #include <stdio.h>
       
    42 #include <time.h>
       
    43 #if defined(_OS_WIN32_)
       
    44 #if defined(_CC_BOOL_DEF_)
       
    45 #undef	bool
       
    46 #include <windows.h>
       
    47 #define bool int
       
    48 #else
       
    49 #include <windows.h>
       
    50 #endif
       
    51 #elif defined(_OS_MSDOS_)
       
    52 #include <dos.h>
       
    53 #elif defined(_OS_OS2_)
       
    54 #include <os2.h>
       
    55 #elif defined(_OS_UNIX_)
       
    56 #include <sys/time.h>
       
    57 #include <unistd.h>
       
    58 #undef	gettimeofday
       
    59 extern "C" int gettimeofday( struct timeval *, struct timezone * );
       
    60 #endif
       
    61 
       
    62 static const uint FIRST_DAY	= 2361222;	// Julian day for 1752/09/14
       
    63 static const int  FIRST_YEAR	= 1752;		// ### wrong for many countries
       
    64 static const uint SECS_PER_DAY	= 86400;
       
    65 static const uint MSECS_PER_DAY = 86400000;
       
    66 static const uint SECS_PER_HOUR = 3600;
       
    67 static const uint MSECS_PER_HOUR= 3600000;
       
    68 static const uint SECS_PER_MIN	= 60;
       
    69 static const uint MSECS_PER_MIN = 60000;
       
    70 
       
    71 static const short monthDays[] ={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
       
    72 
       
    73 // ##### Localize.
       
    74 
       
    75 const char * const QDate::monthNames[] = {
       
    76     "Jan", "Feb", "Mar", "Apr", "May", "Jun",
       
    77     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
       
    78 
       
    79 const char * const QDate::weekdayNames[] ={
       
    80     "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
       
    81 
       
    82 
       
    83 /*****************************************************************************
       
    84   QDate member functions
       
    85  *****************************************************************************/
       
    86 
       
    87 // REVISED: aavit
       
    88 
       
    89 /*!
       
    90   \class QDate qdatetime.h
       
    91   \brief The QDate class provides date functions.
       
    92 
       
    93   \ingroup time
       
    94 
       
    95   A QDate object contains a calendar date, i.e. year, month, and day
       
    96   numbers in the modern western (Gregorian) calendar. It can read the
       
    97   current date from the system clock. It provides functions for
       
    98   comparing dates and for manipulating a date by adding a number of
       
    99   days.
       
   100 
       
   101   A QDate object is typically created either by giving the year, month
       
   102   and day numbers explicitly, or by using the static function
       
   103   currentDate(), which makes a QDate object which contains the
       
   104   system's clock date. An explicit date can also be set using
       
   105   setYMD().
       
   106 
       
   107   The year(), month(), and day() functions provide access to the year,
       
   108   month, and day numbers. Also, dayOfWeek() and dayOfYear() functions
       
   109   are provided. The same information is provided in textual format by
       
   110   the toString(), dayName(), and monthName() functions.
       
   111 
       
   112   QDate provides a full set of operators to compare two QDate
       
   113   objects. A date is considered smaller than another if it is earlier
       
   114   than the other.
       
   115 
       
   116   The date a given number of days later than a given date can be found
       
   117   using the addDays() function. Correspondingly, the number of days
       
   118   between two dates can be found using the daysTo() function.
       
   119 
       
   120   The daysInMonth() and daysInYear() functions tell how many days
       
   121   there are in this date's month and year, respectively. The
       
   122   isLeapYear() function tells whether this date is in a leap year.
       
   123 
       
   124   Note that QDate may not be used for date calculations for dates in
       
   125   the remote past, i.e. prior to the introduction of the Gregorian
       
   126   calendar. This calendar was adopted by England Sep. 14. 1752 (hence
       
   127   this is the earliest valid QDate), and subsequently by most other
       
   128   western countries, until 1923.
       
   129 
       
   130   The end of time is reached around 8000AD, by which time we expect Qt
       
   131   to be obsolete.
       
   132 
       
   133   \sa QTime, QDateTime
       
   134 */
       
   135 
       
   136 
       
   137 /*!
       
   138   \fn QDate::QDate()
       
   139   Constructs a null date. Null dates are invalid.
       
   140 
       
   141   \sa isNull(), isValid()
       
   142 */
       
   143 
       
   144 
       
   145 /*!
       
   146   Constructs a date with the year \a y, month \a m and day \a d.
       
   147 
       
   148   \a y must be in the range 1752-ca. 8000, \a m must be in the range
       
   149   1-12, and \a d must be in the range 1-31. Exception: if \a y is in
       
   150   the range 0-99, it is interpreted as 1900-1999.
       
   151 
       
   152   \sa isValid()
       
   153 */
       
   154 
       
   155 QDate::QDate( int y, int m, int d )
       
   156 {
       
   157     jd = 0;
       
   158     setYMD( y, m, d );
       
   159 }
       
   160 
       
   161 
       
   162 /*!
       
   163   \fn bool QDate::isNull() const
       
   164 
       
   165   Returns TRUE if the date is null.  A null date is invalid.
       
   166 
       
   167   \sa isValid()
       
   168 */
       
   169 
       
   170 
       
   171 /*!
       
   172   Returns TRUE if this date is valid.
       
   173 
       
   174   \sa isNull()
       
   175 */
       
   176 
       
   177 bool QDate::isValid() const
       
   178 {
       
   179     return jd >= FIRST_DAY;
       
   180 }
       
   181 
       
   182 
       
   183 /*!
       
   184   Returns the year (>= 1752) of this date.
       
   185 
       
   186   \sa month(), day()
       
   187 */
       
   188 
       
   189 int QDate::year() const
       
   190 {
       
   191     int y, m, d;
       
   192     jul2greg( jd, y, m, d );
       
   193     return y;
       
   194 }
       
   195 
       
   196 /*!
       
   197   Returns the month (January=1 .. December=12) of this date.
       
   198 
       
   199   \sa year(), day()
       
   200 */
       
   201 
       
   202 int QDate::month() const
       
   203 {
       
   204     int y, m, d;
       
   205     jul2greg( jd, y, m, d );
       
   206     return m;
       
   207 }
       
   208 
       
   209 /*!
       
   210   Returns the day of the month (1..31) of this date.
       
   211 
       
   212   \sa year(), month(), dayOfWeek()
       
   213 */
       
   214 
       
   215 int QDate::day() const
       
   216 {
       
   217     int y, m, d;
       
   218     jul2greg( jd, y, m, d );
       
   219     return d;
       
   220 }
       
   221 
       
   222 /*!
       
   223   Returns the weekday (Monday=1 .. Sunday=7) for this date.
       
   224 
       
   225   \sa day(), dayOfYear()
       
   226 */
       
   227 
       
   228 int QDate::dayOfWeek() const
       
   229 {
       
   230     return (((jd+1) % 7) + 6)%7 + 1;
       
   231 }
       
   232 
       
   233 /*!
       
   234   Returns the day of the year (1..365) for this date.
       
   235 
       
   236   \sa day(), dayOfWeek()
       
   237 */
       
   238 
       
   239 int QDate::dayOfYear() const
       
   240 {
       
   241     return jd - greg2jul(year(), 1, 1) + 1;
       
   242 }
       
   243 
       
   244 /*!
       
   245   Returns the number of days in the month (28..31) for this date.
       
   246 
       
   247   \sa day(), daysInYear()
       
   248 */
       
   249 
       
   250 int QDate::daysInMonth() const
       
   251 {
       
   252     int y, m, d;
       
   253     jul2greg( jd, y, m, d );
       
   254     if ( m == 2 && leapYear(y) )
       
   255 	return 29;
       
   256     else
       
   257 	return monthDays[m];
       
   258 }
       
   259 
       
   260 /*!
       
   261   Returns the number of days in the year (365 or 366) for this date.
       
   262 
       
   263   \sa day(), daysInMonth()
       
   264 */
       
   265 
       
   266 int QDate::daysInYear() const
       
   267 {
       
   268     int y, m, d;
       
   269     jul2greg( jd, y, m, d );
       
   270     return leapYear(y) ? 366 : 365;
       
   271 }
       
   272 
       
   273 
       
   274 /*!
       
   275   Returns the name of the \a month.
       
   276 
       
   277   Month 1 == "Jan", month 2 == "Feb" etc.
       
   278 
       
   279   \sa toString(), dayName()
       
   280 */
       
   281 
       
   282 QString QDate::monthName( int month ) const
       
   283 {
       
   284 #if defined(CHECK_RANGE)
       
   285     if ( month < 1 || month > 12 ) {
       
   286 	qWarning( "QDate::monthName: Parameter out ouf range." );
       
   287 	month = 1;
       
   288     }
       
   289 #endif
       
   290     // ### Remove the fromLatin1 during localization
       
   291     return QString::fromLatin1(monthNames[month-1]);
       
   292 }
       
   293 
       
   294 /*!
       
   295   Returns the name of the \a weekday.
       
   296 
       
   297   Weekday 1 == "Mon", day 2 == "Tue" etc.
       
   298 
       
   299   \sa toString(), monthName()
       
   300 */
       
   301 
       
   302 QString QDate::dayName( int weekday ) const
       
   303 {
       
   304 #if defined(CHECK_RANGE)
       
   305     if ( weekday < 1 || weekday > 7 ) {
       
   306 	qWarning( "QDate::dayName: Parameter out of range." );
       
   307 	weekday = 1;
       
   308     }
       
   309 #endif
       
   310     // ### Remove the fromLatin1 during localization
       
   311     return QString::fromLatin1(weekdayNames[weekday-1]);
       
   312 }
       
   313 
       
   314 
       
   315 /*!
       
   316   Returns the date as a string.
       
   317 
       
   318   The string format is "Sat May 20 1995". This function uses the
       
   319   dayName() and monthName() functions to generate the string.
       
   320 
       
   321   \sa dayName(), monthName()
       
   322 */
       
   323 
       
   324 QString QDate::toString() const
       
   325 {
       
   326     int y, m, d;
       
   327     jul2greg( jd, y, m, d );
       
   328     QString buf = dayName(dayOfWeek());
       
   329     buf += ' ';
       
   330     buf += monthName(m);
       
   331     QString t;
       
   332     t.sprintf( " %d %d", d, y);
       
   333     buf += t;
       
   334     return buf;
       
   335 }
       
   336 
       
   337 
       
   338 /*!
       
   339   Sets the year \a y, month \a m and day \a d.
       
   340 
       
   341   \a y must be in the range 1752-ca. 8000, \a m must be in the range
       
   342   1-12, and \a d must be in the range 1-31. Exception: if \a y is in
       
   343   the range 0-99, it is interpreted as 1900-1999.
       
   344 
       
   345   Returns TRUE if the date is valid, otherwise FALSE.
       
   346 */
       
   347 
       
   348 bool QDate::setYMD( int y, int m, int d )
       
   349 {
       
   350     if ( !isValid(y,m,d) ) {
       
   351 #if defined(CHECK_RANGE)
       
   352 	 qWarning( "QDate::setYMD: Invalid date %04d/%02d/%02d", y, m, d );
       
   353 #endif
       
   354 	 return FALSE;
       
   355     }
       
   356     jd = greg2jul( y, m, d );
       
   357 #if defined(DEBUG)
       
   358     ASSERT( year() == (y > 99 ? y : 1900+y) && month() == m && day() == d );
       
   359 #endif
       
   360     return TRUE;
       
   361 }
       
   362 
       
   363 /*!
       
   364   Returns a QDate object containing a date \a ndays later than the
       
   365   date of this object (or earlier if \a ndays is negative).
       
   366 
       
   367   \sa daysTo()
       
   368 */
       
   369 
       
   370 QDate QDate::addDays( int ndays ) const
       
   371 {
       
   372     QDate d;
       
   373     d.jd = jd + ndays;
       
   374     return d;
       
   375 }
       
   376 
       
   377 /*!
       
   378   Returns the number of days from this date to \a d (which is negative
       
   379   if \a d is earlier than this date).
       
   380 
       
   381   Example:
       
   382   \code
       
   383     QDate d1( 1995, 5, 17 );		// May 17th 1995
       
   384     QDate d2( 1995, 5, 20 );		// May 20th 1995
       
   385     d1.daysTo( d2 );			// returns 3
       
   386     d2.daysTo( d1 );			// returns -3
       
   387   \endcode
       
   388 
       
   389   \sa addDays()
       
   390 */
       
   391 
       
   392 int QDate::daysTo( const QDate &d ) const
       
   393 {
       
   394     return d.jd - jd;
       
   395 }
       
   396 
       
   397 
       
   398 /*!
       
   399   \fn bool QDate::operator==( const QDate &d ) const
       
   400   Returns TRUE if this date is equal to \a d, or FALSE if
       
   401   they are different.
       
   402 */
       
   403 
       
   404 /*!
       
   405   \fn bool QDate::operator!=( const QDate &d ) const
       
   406   Returns TRUE if this date is different from \a d, or FALSE if
       
   407   they are equal.
       
   408 */
       
   409 
       
   410 /*!
       
   411   \fn bool QDate::operator<( const QDate &d ) const
       
   412   Returns TRUE if this date is earlier than \a d, otherwise FALSE.
       
   413 */
       
   414 
       
   415 /*!
       
   416   \fn bool QDate::operator<=( const QDate &d ) const
       
   417   Returns TRUE if this date is earlier than or equal to \a d, otherwise FALSE.
       
   418 */
       
   419 
       
   420 /*!
       
   421   \fn bool QDate::operator>( const QDate &d ) const
       
   422   Returns TRUE if this date is later than \a d, otherwise FALSE.
       
   423 */
       
   424 
       
   425 /*!
       
   426   \fn bool QDate::operator>=( const QDate &d ) const
       
   427   Returns TRUE if this date is later than or equal to \a d, otherwise FALSE.
       
   428 */
       
   429 
       
   430 
       
   431 /*!
       
   432   Returns the current date, as reported by the system clock.
       
   433 
       
   434   \sa QTime::currentTime(), QDateTime::currentDateTime()
       
   435 */
       
   436 
       
   437 QDate QDate::currentDate()
       
   438 {
       
   439 #if defined(_OS_WIN32_)
       
   440 
       
   441     SYSTEMTIME t;
       
   442     GetLocalTime( &t );
       
   443     QDate d;
       
   444     d.jd = greg2jul( t.wYear, t.wMonth, t.wDay );
       
   445     return d;
       
   446 
       
   447 #else
       
   448 
       
   449     time_t ltime;
       
   450     time( &ltime );
       
   451     tm *t = localtime( &ltime );
       
   452     QDate d;
       
   453     d.jd = greg2jul( t->tm_year + 1900, t->tm_mon + 1, t->tm_mday );
       
   454     return d;
       
   455 
       
   456 #endif
       
   457 }
       
   458 
       
   459 /*!
       
   460   Returns TRUE if the specified date (year \a y, month \a m and day \a
       
   461   d) is valid.
       
   462 
       
   463   Example:
       
   464   \code
       
   465     QDate::isValid( 2002, 5, 17 );	// TRUE;  May 17th 2002 is OK.
       
   466     QDate::isValid( 2002, 2, 30 );	// FALSE; Feb 30th does not exist
       
   467     QDate::isValid( 2004, 2, 29 );	// TRUE; 2004 is a leap year
       
   468     QDate::isValid( 1202, 6, 6 );	// FALSE; 1202 is pre-Gregorian
       
   469   \endcode
       
   470 
       
   471   Note that a \a y value in the range 00-99 is interpreted as
       
   472   1900-1999.
       
   473 
       
   474   \sa isNull(), setYMD()
       
   475 */
       
   476 
       
   477 bool QDate::isValid( int y, int m, int d )
       
   478 {
       
   479     if ( y >= 0 && y <= 99 )
       
   480 	y += 1900;
       
   481     else if ( y < FIRST_YEAR || (y == FIRST_YEAR && (m < 9 ||
       
   482 						    (m == 9 && d < 14))) )
       
   483 	return FALSE;
       
   484     return (d > 0 && m > 0 && m <= 12) &&
       
   485 	   (d <= monthDays[m] || (d == 29 && m == 2 && leapYear(y)));
       
   486 }
       
   487 
       
   488 /*!
       
   489   Returns TRUE if the specified year \a y is a leap year.
       
   490 */
       
   491 
       
   492 bool QDate::leapYear( int y )
       
   493 {
       
   494     return y % 4 == 0 && y % 100 != 0 || y % 400 == 0;
       
   495 }
       
   496 
       
   497 /*!
       
   498   \internal
       
   499   Converts a Gregorian date to a Julian day.
       
   500   This algorithm is taken from Communications of the ACM, Vol 6, No 8.
       
   501   \sa jul2greg()
       
   502 */
       
   503 
       
   504 uint QDate::greg2jul( int y, int m, int d )
       
   505 {
       
   506     uint c, ya;
       
   507     if ( y <= 99 )
       
   508 	y += 1900;
       
   509     if ( m > 2 ) {
       
   510 	m -= 3;
       
   511     } else {
       
   512 	m += 9;
       
   513 	y--;
       
   514     }
       
   515     c = y;					// NOTE: Sym C++ 6.0 bug
       
   516     c /= 100;
       
   517     ya = y - 100*c;
       
   518     return 1721119 + d + (146097*c)/4 + (1461*ya)/4 + (153*m+2)/5;
       
   519 }
       
   520 
       
   521 /*!
       
   522   \internal
       
   523   Converts a Julian day to a Gregorian date.
       
   524   This algorithm is taken from Communications of the ACM, Vol 6, No 8.
       
   525   \sa greg2jul()
       
   526 */
       
   527 
       
   528 void QDate::jul2greg( uint jd, int &y, int &m, int &d )
       
   529 {
       
   530     uint x;
       
   531     uint j = jd - 1721119;
       
   532     y = (j*4 - 1)/146097;
       
   533     j = j*4 - 146097*y - 1;
       
   534     x = j/4;
       
   535     j = (x*4 + 3) / 1461;
       
   536     y = 100*y + j;
       
   537     x = (x*4) + 3 - 1461*j;
       
   538     x = (x + 4)/4;
       
   539     m = (5*x - 3)/153;
       
   540     x = 5*x - 3 - 153*m;
       
   541     d = (x + 5)/5;
       
   542     if ( m < 10 ) {
       
   543 	m += 3;
       
   544     } else {
       
   545 	m -= 9;
       
   546 	y++;
       
   547     }
       
   548 }
       
   549 
       
   550 
       
   551 /*****************************************************************************
       
   552   QTime member functions
       
   553  *****************************************************************************/
       
   554 
       
   555 /*!
       
   556   \class QTime qdatetime.h
       
   557 
       
   558   \brief The QTime class provides clock time functions.
       
   559 
       
   560   \ingroup time
       
   561 
       
   562   A QTime object contains a clock time, i.e. a number of hours,
       
   563   minutes, seconds and milliseconds since midnight. It can read the
       
   564   current time from the system clock, and measure a span of elapsed
       
   565   time. It provides functions for comparing times and for manipulating
       
   566   a time by adding a number of (milli)seconds.
       
   567 
       
   568   QTime operates with 24-hour clock format; it has no concept of
       
   569   AM/PM. It operates with local time; it does not know anything about
       
   570   time zones or daylight savings time.
       
   571 
       
   572   A QTime object is typically created either by giving the number of
       
   573   hours, minutes, seconds, and milliseconds explicitly, or by using
       
   574   the static function currentTime(), which makes a QTime object which
       
   575   contains the system's clock time. Note that the accuracy depends on
       
   576   the accuracy of the underlying operating system; not all systems
       
   577   provide 1-millisecond accuracy.
       
   578 
       
   579   The hour(), minute(), second(), and msec() functions provide access
       
   580   to the number of hours, minutes, seconds, and milliseconds of the
       
   581   time. The same information is provided in textual format by the
       
   582   toString() function.
       
   583 
       
   584   QTime provides a full set of operators to compare two QTime
       
   585   objects. A time is considered smaller than another if it is earlier
       
   586   than the other.
       
   587 
       
   588   The time a given number of seconds or milliseconds later than a
       
   589   given time can be found using the addSecs() or addMSecs()
       
   590   functions. Correspondingly, the number of (milli)seconds between two
       
   591   times can be found using the secsTo() or msecsTo() functions.
       
   592 
       
   593   QTime can be used to measure a span of elapsed time using the
       
   594   start(), restart(), and elapsed() functions.
       
   595 
       
   596   \sa QDate, QDateTime
       
   597 */
       
   598 
       
   599 /*!
       
   600   \fn QTime::QTime()
       
   601 
       
   602   Constructs the time 0 hours, minutes, seconds and milliseconds,
       
   603   i.e. 00:00:00.000 (midnight). This is a valid time.
       
   604 
       
   605   \sa isValid()
       
   606 */
       
   607 
       
   608 /*!
       
   609   Constructs a time with hour \a h, minute \a m, seconds \a s and
       
   610   milliseconds \a ms.
       
   611 
       
   612   \a h must be in the range 0-23, \a m and \a s must be in the range
       
   613   0-59, and \a ms must be in the range 0-999.
       
   614 
       
   615   \sa isValid()
       
   616 */
       
   617 
       
   618 QTime::QTime( int h, int m, int s, int ms )
       
   619 {
       
   620     setHMS( h, m, s, ms );
       
   621 }
       
   622 
       
   623 
       
   624 /*!
       
   625   \fn bool QTime::isNull() const
       
   626   Returns TRUE if the time is equal to 00:00:00.000. A null time is valid.
       
   627 
       
   628   \sa isValid()
       
   629 */
       
   630 
       
   631 /*!
       
   632   Returns TRUE if the time is valid, or FALSE if the time is invalid.
       
   633   The time 23:30:55.746 is valid, while 24:12:30 is invalid.
       
   634 
       
   635   \sa isNull()
       
   636 */
       
   637 
       
   638 bool QTime::isValid() const
       
   639 {
       
   640     return ds < MSECS_PER_DAY;
       
   641 }
       
   642 
       
   643 
       
   644 /*!
       
   645   Returns the hour part (0..23) of the time.
       
   646 */
       
   647 
       
   648 int QTime::hour() const
       
   649 {
       
   650     return ds / MSECS_PER_HOUR;
       
   651 }
       
   652 
       
   653 /*!
       
   654   Returns the minute part (0..59) of the time.
       
   655 */
       
   656 
       
   657 int QTime::minute() const
       
   658 {
       
   659     return (ds % MSECS_PER_HOUR)/MSECS_PER_MIN;
       
   660 }
       
   661 
       
   662 /*!
       
   663   Returns the second part (0..59) of the time.
       
   664 */
       
   665 
       
   666 int QTime::second() const
       
   667 {
       
   668     return (ds / 1000)%SECS_PER_MIN;
       
   669 }
       
   670 
       
   671 /*!
       
   672   Returns the millisecond part (0..999) of the time.
       
   673 */
       
   674 
       
   675 int QTime::msec() const
       
   676 {
       
   677     return ds % 1000;
       
   678 }
       
   679 
       
   680 
       
   681 /*!
       
   682   Returns the time of this object in a textual format. Milliseconds
       
   683   are not included. The string format is HH:MM:SS, e.g. 1 second
       
   684   before midnight would be "23:59:59".
       
   685 */
       
   686 
       
   687 QString QTime::toString() const
       
   688 {
       
   689     QString buf;
       
   690     buf.sprintf( "%.2d:%.2d:%.2d", hour(), minute(), second() );
       
   691     return buf;
       
   692 }
       
   693 
       
   694 
       
   695 /*!
       
   696   Sets the time to hour \a h, minute \a m, seconds \a s and
       
   697   milliseconds \a ms.
       
   698 
       
   699   \a h must be in the range 0-23, \a m and \a s must be in the range
       
   700   0-59, and \a ms must be in the range 0-999. Returns TRUE if the set
       
   701   time is valid, otherwise FALSE.
       
   702 
       
   703   \sa isValid()
       
   704 */
       
   705 
       
   706 bool QTime::setHMS( int h, int m, int s, int ms )
       
   707 {
       
   708     if ( !isValid(h,m,s,ms) ) {
       
   709 #if defined(CHECK_RANGE)
       
   710 	qWarning( "QTime::setHMS Invalid time %02d:%02d:%02d.%03d", h, m, s,
       
   711 		 ms );
       
   712 #endif
       
   713 	ds = MSECS_PER_DAY;		// make this invalid
       
   714 	return FALSE;
       
   715     }
       
   716     ds = (h*SECS_PER_HOUR + m*SECS_PER_MIN + s)*1000 + ms;
       
   717     return TRUE;
       
   718 }
       
   719 
       
   720 /*!
       
   721   Returns a QTime object containing a time \a nsecs seconds later than
       
   722   the time of this object (or earlier if \a ms is negative).
       
   723 
       
   724   Note that the time will wrap if it passes midnight.
       
   725 
       
   726   Example:
       
   727   \code
       
   728     QTime n( 14, 0, 0 );                // n == 14:00:00
       
   729     QTime t;
       
   730     t = n.addSecs( 70 );                // t == 14:01:10
       
   731     t = n.addSecs( -70 );               // t == 13:58:50
       
   732     t = n.addSecs( 10*60*60 + 5 );      // t == 00:00:05
       
   733     t = n.addSecs( -15*60*60 );         // t == 23:00:00
       
   734   \endcode
       
   735 
       
   736   \sa addMSecs(), secsTo(), QDateTime::addSecs()
       
   737 */
       
   738 
       
   739 QTime QTime::addSecs( int nsecs ) const
       
   740 {
       
   741     return addMSecs(nsecs*1000);
       
   742 }
       
   743 
       
   744 /*!
       
   745   Returns the number of seconds from this time to \a t (which is
       
   746   negative if \a t is earlier than this time).
       
   747 
       
   748   Since QTime measures time within a day and there are 86400 seconds
       
   749   in a day, the result is between -86400 and 86400.
       
   750 
       
   751   \sa addSecs() QDateTime::secsTo()
       
   752 */
       
   753 
       
   754 int QTime::secsTo( const QTime &t ) const
       
   755 {
       
   756     return ((int)t.ds - (int)ds)/1000;
       
   757 }
       
   758 
       
   759 /*!
       
   760   Returns a QTime object containing a time \a ms milliseconds later than
       
   761   the time of this object (or earlier if \a ms is negative).
       
   762 
       
   763   Note that the time will wrap if it passes midnight. See addSecs()
       
   764   for an example.
       
   765 
       
   766   \sa addSecs(), msecsTo()
       
   767 */
       
   768 
       
   769 QTime QTime::addMSecs( int ms ) const
       
   770 {
       
   771     QTime t;
       
   772     if ( ms < 0 ) {
       
   773 	// % not well-defined for -ve, but / is.
       
   774 	int negdays = (MSECS_PER_DAY-ms) / MSECS_PER_DAY;
       
   775 	t.ds = ((int)ds + ms + negdays*MSECS_PER_DAY)
       
   776 		% MSECS_PER_DAY;
       
   777     } else {
       
   778 	t.ds = ((int)ds + ms) % MSECS_PER_DAY;
       
   779     }
       
   780     return t;
       
   781 }
       
   782 
       
   783 /*!
       
   784   Returns the number of milliseconds from this time to \a t (which is
       
   785   negative if \a t is earlier than this time).
       
   786 
       
   787   Since QTime measures time within a day and there are 86400000
       
   788   milliseconds in a day, the result is between -86400000 and 86400000.
       
   789 
       
   790   \sa secsTo()
       
   791 */
       
   792 
       
   793 int QTime::msecsTo( const QTime &t ) const
       
   794 {
       
   795     return (int)t.ds - (int)ds;
       
   796 }
       
   797 
       
   798 
       
   799 /*!
       
   800   \fn bool QTime::operator==( const QTime &t ) const
       
   801 
       
   802   Returns TRUE if this time is equal to \a t, or FALSE if they are
       
   803   different.
       
   804 */
       
   805 
       
   806 /*!
       
   807   \fn bool QTime::operator!=( const QTime &t ) const
       
   808 
       
   809   Returns TRUE if this time is different from \a t, or FALSE if they
       
   810   are equal.
       
   811 */
       
   812 
       
   813 /*!
       
   814   \fn bool QTime::operator<( const QTime &t ) const
       
   815 
       
   816   Returns TRUE if this time is earlier than \a t, otherwise FALSE.
       
   817 */
       
   818 
       
   819 /*!
       
   820   \fn bool QTime::operator<=( const QTime &t ) const
       
   821 
       
   822   Returns TRUE if this time is earlier than or equal to \a t,
       
   823   otherwise FALSE.
       
   824 */
       
   825 
       
   826 /*!
       
   827   \fn bool QTime::operator>( const QTime &t ) const
       
   828 
       
   829   Returns TRUE if this time is later than \a t, otherwise FALSE.
       
   830 */
       
   831 
       
   832 /*!
       
   833   \fn bool QTime::operator>=( const QTime &t ) const
       
   834 
       
   835   Returns TRUE if this time is later than or equal to \a t, otherwise
       
   836   FALSE.
       
   837 */
       
   838 
       
   839 
       
   840 
       
   841 /*!
       
   842   Returns the current time, as reported by the system clock.
       
   843 
       
   844   Note that the accuracy depends on the accuracy of the underlying
       
   845   operating system; not all systems provide 1-millisecond accuracy.
       
   846 */
       
   847 
       
   848 QTime QTime::currentTime()
       
   849 {
       
   850     QTime ct;
       
   851     currentTime( &ct );
       
   852     return ct;
       
   853 }
       
   854 
       
   855 /*!
       
   856   \internal
       
   857 
       
   858   Fetches the current time and returns TRUE if the time is within one
       
   859   minute after midnight, otherwise FALSE. The return value is used by
       
   860   QDateTime::currentDateTime() to ensure that the date there is correct.
       
   861 */
       
   862 
       
   863 bool QTime::currentTime( QTime *ct )
       
   864 {
       
   865     if ( !ct ) {
       
   866 #if defined(CHECK_NULL)
       
   867 	qWarning( "QTime::currentTime(QTime *): Null pointer not allowed" );
       
   868 #endif
       
   869 	return FALSE;
       
   870     }
       
   871 
       
   872 #if defined(_OS_WIN32_)
       
   873 
       
   874     SYSTEMTIME t;
       
   875     GetLocalTime( &t );
       
   876     ct->ds = MSECS_PER_HOUR*t.wHour + MSECS_PER_MIN*t.wMinute +
       
   877 	     1000*t.wSecond + t.wMilliseconds;
       
   878     return (t.wHour == 0 && t.wMinute == 0);
       
   879 
       
   880 #elif defined(_OS_OS2_)
       
   881 
       
   882     DATETIME t;
       
   883     DosGetDateTime( &t );
       
   884     ct->ds = MSECS_PER_HOUR*t.hours + MSECS_PER_MIN*t.minutes +
       
   885 	     1000*t.seconds + 10*t.hundredths;
       
   886     return (t.hours == 0 && t.minutes == 0);
       
   887 
       
   888 #elif defined(_OS_MSDOS_)
       
   889 
       
   890     _dostime_t t;
       
   891     _dos_gettime( &t );
       
   892     ct->ds = MSECS_PER_HOUR*t.hour + MSECS_PER_MIN*t.minute +
       
   893 	     t.second*1000 + t.hsecond*10;
       
   894     return (t.hour== 0 && t.minute == 0);
       
   895 
       
   896 #elif defined(_OS_UNIX_)
       
   897 
       
   898     struct timeval tv;
       
   899     gettimeofday( &tv, 0 );
       
   900     time_t ltime = tv.tv_sec;
       
   901     tm *t = localtime( &ltime );
       
   902     ct->ds = (uint)( MSECS_PER_HOUR*t->tm_hour + MSECS_PER_MIN*t->tm_min +
       
   903 		     1000*t->tm_sec + tv.tv_usec/1000 );
       
   904     return (t->tm_hour== 0 && t->tm_min == 0);
       
   905 
       
   906 #else
       
   907 
       
   908     time_t ltime;			// no millisecond resolution!!
       
   909     ::time( &ltime );
       
   910     tm *t = localtime( &ltime );
       
   911     ct->ds = MSECS_PER_HOUR*t->tm_hour + MSECS_PER_MIN*t->tm_min +
       
   912 	     1000*t->tm_sec;
       
   913     return (t->tm_hour== 0 && t->tm_min == 0);
       
   914 #endif
       
   915 }
       
   916 
       
   917 /*!
       
   918   Returns TRUE if the specified time is valid, otherwise FALSE.
       
   919 
       
   920   The time is valid if \a h is in the range 0-23, \a m and \a s are in
       
   921   the range 0-59, and \a ms is in the range 0-999.
       
   922 
       
   923   Example:
       
   924   \code
       
   925     QTime::isValid(21, 10, 30);		// returns TRUE
       
   926     QTime::isValid(22, 5,  62);		// returns FALSE
       
   927   \endcode
       
   928 */
       
   929 
       
   930 bool QTime::isValid( int h, int m, int s, int ms )
       
   931 {
       
   932     return (uint)h < 24 && (uint)m < 60 && (uint)s < 60 && (uint)ms < 1000;
       
   933 }
       
   934 
       
   935 
       
   936 /*!
       
   937   Sets this time to the current time. This is practical for timing:
       
   938 
       
   939   \code
       
   940     QTime t;
       
   941     t.start();				// start clock
       
   942     ... // some lengthy task
       
   943     qDebug( "%d\n", t.elapsed() );	// prints # msecs elapsed
       
   944   \endcode
       
   945 
       
   946   \sa restart(), elapsed(), currentTime()
       
   947 */
       
   948 
       
   949 void QTime::start()
       
   950 {
       
   951     *this = currentTime();
       
   952 }
       
   953 
       
   954 /*!
       
   955   Sets this time to the current time, and returns the number of
       
   956   milliseconds that have elapsed since the last time start() or
       
   957   restart() was called.
       
   958 
       
   959   This function is guaranteed to be atomic, and is thus very handy for
       
   960   repeated measurements: call start() to start the first measurement,
       
   961   then restart() for each later measurement.
       
   962 
       
   963   Note that the counter wraps to zero 24 hours after the last call to
       
   964   start() or restart().
       
   965 
       
   966   \warning If the system's clock setting has been changed since the
       
   967   last time start() or restart() was called, the result is undefined.
       
   968   This can happen e.g. when daylight saving is turned on or off.
       
   969 
       
   970   \sa start(), elapsed(), currentTime()
       
   971 */
       
   972 
       
   973 int QTime::restart()
       
   974 {
       
   975     QTime t = currentTime();
       
   976     int n = msecsTo( t );
       
   977     if ( n < 0 )				// passed midnight
       
   978 	n += 86400*1000;
       
   979     *this = t;
       
   980     return n;
       
   981 }
       
   982 
       
   983 /*!
       
   984   Returns the number of milliseconds that have elapsed since the last
       
   985   time start() or restart() was called.
       
   986 
       
   987   Note that the counter wraps to zero 24 hours after the last call to
       
   988   start() or restart.
       
   989 
       
   990   Note that the accuracy depends on the accuracy of the underlying
       
   991   operating system; not all systems provide 1-millisecond accuracy.
       
   992 
       
   993   \warning If the system's clock setting has been changed since the
       
   994   last time start() or restart() was called, the result is undefined.
       
   995   This can happen e.g. when daylight saving is turned on or off.
       
   996 
       
   997   \sa start(), restart()
       
   998 */
       
   999 
       
  1000 int QTime::elapsed()
       
  1001 {
       
  1002     int n = msecsTo( currentTime() );
       
  1003     if ( n < 0 )				// passed midnight
       
  1004 	n += 86400*1000;
       
  1005     return n;
       
  1006 }
       
  1007 
       
  1008 
       
  1009 /*****************************************************************************
       
  1010   QDateTime member functions
       
  1011  *****************************************************************************/
       
  1012 
       
  1013 /*!
       
  1014   \class QDateTime qdatetime.h
       
  1015   \brief The QDateTime class provides date and time functions.
       
  1016 
       
  1017   \ingroup time
       
  1018 
       
  1019   A QDateTime object contains a calendar date and a clock time (a
       
  1020   "datetime"). It is a combination of the QDate and QTime classes. It
       
  1021   can read the current datetime from the system clock. It provides
       
  1022   functions for comparing datetimes and for manipulating a datetime by
       
  1023   adding a number of seconds or days.
       
  1024 
       
  1025   A QDateTime object is typically created either by giving a date and
       
  1026   time explicitly, or by using the static function currentTime(),
       
  1027   which makes a QDateTime object which contains the system's clock
       
  1028   time.
       
  1029 
       
  1030   The date() and time() functions provide access to the date and time
       
  1031   parts of the datetime. The same information is provided in textual
       
  1032   format by the toString() function.
       
  1033 
       
  1034   QDateTime provides a full set of operators to compare two QDateTime
       
  1035   objects. A datetime is considered smaller than another if it is
       
  1036   earlier than the other.
       
  1037 
       
  1038   The datetime a given number of days or seconds later than a given
       
  1039   datetime can be found using the addDays() and addSecs()
       
  1040   functions. Correspondingly, the number of days or seconds between
       
  1041   two times can be found using the daysTo() or secsTo() functions.
       
  1042 
       
  1043   A datetime can also be set using the setTime_t() function, which
       
  1044   takes a POSIX-standard "number of seconds since 00:00:00 on January
       
  1045   1, 1970" value.
       
  1046 
       
  1047   The limitations regarding range and resolution mentioned in the
       
  1048   QDate and QTime documentation apply for QDateTime also.
       
  1049 
       
  1050   \sa QDate, QTime
       
  1051 */
       
  1052 
       
  1053 
       
  1054 /*!
       
  1055   \fn QDateTime::QDateTime()
       
  1056 
       
  1057   Constructs a null datetime (i.e. null date and null time).  A null
       
  1058   datetime is invalid, since the date is invalid.
       
  1059 
       
  1060   \sa isValid()
       
  1061 */
       
  1062 
       
  1063 
       
  1064 /*!
       
  1065   Constructs a datetime with date \a date and null time (00:00:00.000).
       
  1066 */
       
  1067 
       
  1068 QDateTime::QDateTime( const QDate &date )
       
  1069     : d(date)
       
  1070 {
       
  1071 }
       
  1072 
       
  1073 /*!
       
  1074   Constructs a datetime with date \a date and time \a time.
       
  1075 */
       
  1076 
       
  1077 QDateTime::QDateTime( const QDate &date, const QTime &time )
       
  1078     : d(date), t(time)
       
  1079 {
       
  1080 }
       
  1081 
       
  1082 
       
  1083 /*!
       
  1084   \fn bool QDateTime::isNull() const
       
  1085 
       
  1086   Returns TRUE if both the date and the time are null.	A null date is invalid.
       
  1087 
       
  1088   \sa QDate::isNull(), QTime::isNull()
       
  1089 */
       
  1090 
       
  1091 /*!
       
  1092   \fn bool QDateTime::isValid() const
       
  1093 
       
  1094   Returns TRUE if both the date and the time are valid.
       
  1095 
       
  1096   \sa QDate::isValid(), QTime::isValid()
       
  1097 */
       
  1098 
       
  1099 /*!
       
  1100   \fn QDate QDateTime::date() const
       
  1101 
       
  1102   Returns the date part of this datetime.
       
  1103 
       
  1104   \sa setDate(), time()
       
  1105 */
       
  1106 
       
  1107 /*!
       
  1108   \fn QTime QDateTime::time() const
       
  1109 
       
  1110   Returns the time part of this datetime.
       
  1111 
       
  1112   \sa setTime(), date()
       
  1113 */
       
  1114 
       
  1115 /*!
       
  1116   \fn void QDateTime::setDate( const QDate &date )
       
  1117 
       
  1118   Sets the date part of this datetime.
       
  1119 
       
  1120   \sa date(), setTime()
       
  1121 */
       
  1122 
       
  1123 /*!
       
  1124   \fn void QDateTime::setTime( const QTime &time )
       
  1125 
       
  1126   Sets the time part of this datetime.
       
  1127 
       
  1128   \sa time(), setDate()
       
  1129 */
       
  1130 
       
  1131 
       
  1132 /*!
       
  1133   Sets the local date and time given the number of seconds that have passed
       
  1134   since 00:00:00 on January 1, 1970, Coordinated Universal Time (UTC).
       
  1135   On systems that do not support timezones this function will behave as if
       
  1136   local time were UTC.
       
  1137 
       
  1138   Note that Microsoft Windows supports only a limited range of values for
       
  1139   \a secsSince1Jan1970UTC.
       
  1140 */
       
  1141 
       
  1142 void QDateTime::setTime_t( uint secsSince1Jan1970UTC )
       
  1143 {
       
  1144     time_t tmp = (time_t) secsSince1Jan1970UTC;
       
  1145     tm *tM = localtime( &tmp );
       
  1146     if ( !tM ) {
       
  1147 	tM = gmtime( &tmp );
       
  1148 	if ( !tM ) {
       
  1149 	    d.jd = QDate::greg2jul( 1970, 1, 1 );
       
  1150 	    t.ds = 0;
       
  1151 	    return;
       
  1152 	}
       
  1153     }
       
  1154     d.jd = QDate::greg2jul( tM->tm_year + 1900, tM->tm_mon + 1, tM->tm_mday );
       
  1155     t.ds = MSECS_PER_HOUR*tM->tm_hour + MSECS_PER_MIN*tM->tm_min +
       
  1156 	    1000*tM->tm_sec;
       
  1157 }
       
  1158 
       
  1159 
       
  1160 /*!
       
  1161   Returns the datetime as a string.
       
  1162 
       
  1163   The string format is "Sat May 20 03:40:13 1998".
       
  1164 
       
  1165   This function uses QDate::dayName(), QDate::monthName(), and
       
  1166   QTime::toString() to generate the string.
       
  1167 
       
  1168 */
       
  1169 
       
  1170 QString QDateTime::toString() const
       
  1171 {
       
  1172     QString buf = d.dayName(d.dayOfWeek());
       
  1173     buf += ' ';
       
  1174     buf += d.monthName(d.month());
       
  1175     buf += ' ';
       
  1176     buf += QString().setNum(d.day());
       
  1177     buf += ' ';
       
  1178     buf += t.toString();
       
  1179     buf += ' ';
       
  1180     buf += QString().setNum(d.year());
       
  1181     return buf;
       
  1182 }
       
  1183 
       
  1184 /*!
       
  1185   Returns a QDateTime object containing a datetime \a ndays days later
       
  1186   than the datetime of this object (or earlier if \a ndays is
       
  1187   negative).
       
  1188 
       
  1189   \sa daysTo(), addSecs()
       
  1190 */
       
  1191 
       
  1192 QDateTime QDateTime::addDays( int ndays ) const
       
  1193 {
       
  1194     return QDateTime( d.addDays(ndays), t );
       
  1195 }
       
  1196 
       
  1197 /*!
       
  1198   Returns a QDateTime object containing a datetime \a nsecs seconds
       
  1199   later than the datetime of this object (or earlier if \a nsecs is
       
  1200   negative).
       
  1201 
       
  1202   \sa secsTo(), addDays()
       
  1203 */
       
  1204 
       
  1205 QDateTime QDateTime::addSecs( int nsecs ) const
       
  1206 {
       
  1207     uint dd = d.jd;
       
  1208     int  tt = t.ds;
       
  1209     int  sign = 1;
       
  1210     if ( nsecs < 0 ) {
       
  1211 	nsecs = -nsecs;
       
  1212 	sign = -1;
       
  1213     }
       
  1214     if ( nsecs >= (int)SECS_PER_DAY ) {
       
  1215 	dd += sign*(nsecs/SECS_PER_DAY);
       
  1216 	nsecs %= SECS_PER_DAY;
       
  1217     }
       
  1218     tt += sign*nsecs*1000;
       
  1219     if ( tt < 0 ) {
       
  1220 	tt = MSECS_PER_DAY - tt - 1;
       
  1221 	dd -= tt / MSECS_PER_DAY;
       
  1222 	tt = tt % MSECS_PER_DAY;
       
  1223 	tt = MSECS_PER_DAY - tt - 1;
       
  1224     } else if ( tt >= (int)MSECS_PER_DAY ) {
       
  1225 	dd += ( tt / MSECS_PER_DAY );
       
  1226 	tt = tt % MSECS_PER_DAY;
       
  1227     }
       
  1228     QDateTime ret;
       
  1229     ret.t.ds = tt;
       
  1230     ret.d.jd = dd;
       
  1231     return ret;
       
  1232 }
       
  1233 
       
  1234 /*!
       
  1235   Returns the number of days from this datetime to \a dt (which is
       
  1236   negative if \a dt is earlier than this datetime).
       
  1237 
       
  1238   \sa addDays(), secsTo()
       
  1239 */
       
  1240 
       
  1241 int QDateTime::daysTo( const QDateTime &dt ) const
       
  1242 {
       
  1243     return d.daysTo( dt.d );
       
  1244 }
       
  1245 
       
  1246 /*!
       
  1247   Returns the number of seconds from this datetime to \a dt (which is
       
  1248   negative if \a dt is earlier than this datetime).
       
  1249 
       
  1250   Example:
       
  1251   \code
       
  1252     QDateTime dt = QDateTime::currentDateTime();
       
  1253     QDateTime x( QDate(dt.year(),12,24), QTime(17,00) );
       
  1254     qDebug( "There are %d seconds to Christmas", dt.secsTo(x) );
       
  1255   \endcode
       
  1256 
       
  1257   \sa addSecs(), daysTo(), QTime::secsTo()
       
  1258 */
       
  1259 
       
  1260 int QDateTime::secsTo( const QDateTime &dt ) const
       
  1261 {
       
  1262     return t.secsTo(dt.t) + d.daysTo(dt.d)*SECS_PER_DAY;
       
  1263 }
       
  1264 
       
  1265 
       
  1266 /*!
       
  1267   Returns TRUE if this datetime is equal to \a dt, or FALSE if
       
  1268   they are different.
       
  1269   \sa operator!=()
       
  1270 */
       
  1271 
       
  1272 bool QDateTime::operator==( const QDateTime &dt ) const
       
  1273 {
       
  1274     return  t == dt.t && d == dt.d;
       
  1275 }
       
  1276 
       
  1277 /*!
       
  1278   Returns TRUE if this datetime is different from \a dt, or FALSE if
       
  1279   they are equal.
       
  1280   \sa operator==()
       
  1281 */
       
  1282 
       
  1283 bool QDateTime::operator!=( const QDateTime &dt ) const
       
  1284 {
       
  1285     return  t != dt.t || d != dt.d;
       
  1286 }
       
  1287 
       
  1288 /*!
       
  1289   Returns TRUE if this datetime is earlier than \a dt, otherwise FALSE.
       
  1290 */
       
  1291 
       
  1292 bool QDateTime::operator<( const QDateTime &dt ) const
       
  1293 {
       
  1294     if ( d < dt.d )
       
  1295 	return TRUE;
       
  1296     return d == dt.d ? t < dt.t : FALSE;
       
  1297 }
       
  1298 
       
  1299 /*!
       
  1300   Returns TRUE if this datetime is earlier than or equal to \a dt,
       
  1301   otherwise FALSE.
       
  1302 */
       
  1303 
       
  1304 bool QDateTime::operator<=( const QDateTime &dt ) const
       
  1305 {
       
  1306     if ( d < dt.d )
       
  1307 	return TRUE;
       
  1308     return d == dt.d ? t <= dt.t : FALSE;
       
  1309 }
       
  1310 
       
  1311 /*!
       
  1312   Returns TRUE if this datetime is later than \a dt, otherwise FALSE.
       
  1313 */
       
  1314 
       
  1315 bool QDateTime::operator>( const QDateTime &dt ) const
       
  1316 {
       
  1317     if ( d > dt.d )
       
  1318 	return TRUE;
       
  1319     return d == dt.d ? t > dt.t : FALSE;
       
  1320 }
       
  1321 
       
  1322 /*!
       
  1323   Returns TRUE if this datetime is later than or equal to \a dt,
       
  1324   otherwise FALSE.
       
  1325 */
       
  1326 
       
  1327 bool QDateTime::operator>=( const QDateTime &dt ) const
       
  1328 {
       
  1329     if ( d > dt.d )
       
  1330 	return TRUE;
       
  1331     return d == dt.d ? t >= dt.t : FALSE;
       
  1332 }
       
  1333 
       
  1334 /*!
       
  1335   Returns the current datetime, as reported by the system clock.
       
  1336 
       
  1337   \sa QDate::currentDate(), QTime::currentTime()
       
  1338 */
       
  1339 
       
  1340 QDateTime QDateTime::currentDateTime()
       
  1341 {
       
  1342     QDate cd = QDate::currentDate();
       
  1343     QTime ct;
       
  1344     if ( QTime::currentTime(&ct) )		// too close to midnight?
       
  1345 	cd = QDate::currentDate();		// YES! time for some midnight
       
  1346 						// voodoo, fetch date again
       
  1347     return QDateTime( cd, ct );
       
  1348 }
       
  1349 
       
  1350 
       
  1351 /*****************************************************************************
       
  1352   Date/time stream functions
       
  1353  *****************************************************************************/
       
  1354 
       
  1355 #ifndef QT_NO_DATASTREAM
       
  1356 /*!
       
  1357   \relates QDate
       
  1358   Writes the date to the stream.
       
  1359 
       
  1360   \sa \link datastreamformat.html Format of the QDataStream operators \endlink
       
  1361 */
       
  1362 
       
  1363 QDataStream &operator<<( QDataStream &s, const QDate &d )
       
  1364 {
       
  1365     return s << (Q_UINT32)(d.jd);
       
  1366 }
       
  1367 
       
  1368 /*!
       
  1369   \relates QDate
       
  1370   Reads a date from the stream.
       
  1371 
       
  1372   \sa \link datastreamformat.html Format of the QDataStream operators \endlink
       
  1373 */
       
  1374 
       
  1375 QDataStream &operator>>( QDataStream &s, QDate &d )
       
  1376 {
       
  1377     Q_UINT32 jd;
       
  1378     s >> jd;
       
  1379     d.jd = jd;
       
  1380     return s;
       
  1381 }
       
  1382 
       
  1383 /*!
       
  1384   \relates QTime
       
  1385   Writes a time to the stream.
       
  1386 
       
  1387   \sa \link datastreamformat.html Format of the QDataStream operators \endlink
       
  1388 */
       
  1389 
       
  1390 QDataStream &operator<<( QDataStream &s, const QTime &t )
       
  1391 {
       
  1392     return s << (Q_UINT32)(t.ds);
       
  1393 }
       
  1394 
       
  1395 /*!
       
  1396   \relates QTime
       
  1397   Reads a time from the stream.
       
  1398 
       
  1399   \sa \link datastreamformat.html Format of the QDataStream operators \endlink
       
  1400 */
       
  1401 
       
  1402 QDataStream &operator>>( QDataStream &s, QTime &t )
       
  1403 {
       
  1404     Q_UINT32 ds;
       
  1405     s >> ds;
       
  1406     t.ds = ds;
       
  1407     return s;
       
  1408 }
       
  1409 
       
  1410 /*!
       
  1411   \relates QDateTime
       
  1412   Writes a datetime to the stream.
       
  1413 
       
  1414   \sa \link datastreamformat.html Format of the QDataStream operators \endlink
       
  1415 */
       
  1416 
       
  1417 QDataStream &operator<<( QDataStream &s, const QDateTime &dt )
       
  1418 {
       
  1419     return s << dt.d << dt.t;
       
  1420 }
       
  1421 
       
  1422 /*!
       
  1423   \relates QDateTime
       
  1424   Reads a datetime from the stream.
       
  1425 
       
  1426   \sa \link datastreamformat.html Format of the QDataStream operators \endlink
       
  1427 */
       
  1428 
       
  1429 QDataStream &operator>>( QDataStream &s, QDateTime &dt )
       
  1430 {
       
  1431     s >> dt.d >> dt.t;
       
  1432     return s;
       
  1433 }
       
  1434 #endif //QT_NO_DATASTREAM