//-*-Mode: C++;-*-
#ifndef _GKTimeDuration_h_
#define _GKTimeDuration_h_
#include "GKUtil.h"
#include <qdatetime.h>
class GKEXPORT GKTimeDuration
{
public:
GKTimeDuration() { ds=0; } // set null time
GKTimeDuration( int h, int m, int s=0, int ms = 0 ); // set time
GKTimeDuration( const QTime & t );
~GKTimeDuration() {}
/*! A duration of 0 milliseconds.
*/
bool isNull() const { return ds == 0; }
/*! Is valid?
*/
bool isValid() const;
/*! Convers this duration to hour, minutes, seconds and milliseconds and returns the hour.
For example: 3610.5 is converted to 01:00:10.500 and it returns 1.
*/
qint64 hour() const;
/*! Convers this duration to hour, minutes, seconds and milliseconds and returns the minute.
For example: 3610.5 is converted to 01:00:10.500 and it returns 0.
*/
qint64 minute() const;
/*! Convers this duration to hour, minutes, seconds and milliseconds and returns the second.
For example: 3610.5 is converted to 01:00:10.500 and it returns 10.
*/
qint64 second() const;
/*! Convers this duration to hour, minutes, seconds and milliseconds and returns the millisecond.
For example: 3610.5 is converted to 01:00:10.500 and it returns 500.
*/
qint64 msec() const;
/*! Get this duration in milliseconds (note that this is not equal to GKTimeDuration::msec)
*/
qint64 toMilliseconds() const;
/*! Returns a string representation of this duration. If forceMilliseconds is false it will not
add millisecond info when they are zero.
*/
QString toString( bool forceMilliseconds = false ) const;
/*! Set the duration.
*/
bool setHMS( int h, int m, int s, int ms = 0 );
/*! Retuns a QTime equivalent to this duration. Note that an overflow is possible as QTime
only support 24 hours.
*/
QTime toQTime() const;
//! Returns this GKTimeDuration's hour, minute and second converted to seconds
qint64 toSeconds( uint * miliseconds = NULL ) const;
/*! Returns this duration in days, the remaining time is returned in milliseconds.
*/
qint64 toDays( uint * miliseconds = NULL ) const;
/*!Returns this GKTimeDuration's hour, minute and second converted to minutes
*/
float toMinutes() const;
//! Returns this GKTimeDuration's hour, minute and second converted to hours
float toHours() const;
GKTimeDuration addSecs( qint64 secs ) const;
qint64 secsTo( const GKTimeDuration & ) const;
GKTimeDuration addMSecs( qint64 ms ) const;
qint64 msecsTo( const GKTimeDuration &t ) const;
bool operator==( const GKTimeDuration &d ) const { return ds == d.ds; }
bool operator!=( const GKTimeDuration &d ) const { return ds != d.ds; }
bool operator<( const GKTimeDuration &d ) const { return ds < d.ds; }
bool operator<=( const GKTimeDuration &d ) const { return ds <= d.ds; }
bool operator>( const GKTimeDuration &d ) const { return ds > d.ds; }
bool operator>=( const GKTimeDuration &d ) const { return ds >= d.ds; }
GKTimeDuration & operator += ( const GKTimeDuration & c );
GKTimeDuration & operator -= ( const GKTimeDuration & c );
GKTimeDuration operator + ( const GKTimeDuration & c ) const;
GKTimeDuration operator - ( const GKTimeDuration & c ) const;
/*! Duration between to times. Note that a duration is always positive so this function will
reorder from and to if to < from.
*/
static GKTimeDuration durationBetweenTimes( const QTime & from, const QTime & to );
/*! Is valid?
*/
static bool isValid( int h, int m, int s );
/*! Returns a duration from a string in the format HH:MM:SS
*/
static GKTimeDuration fromString( const QString &s );
private:
quint64 ds;
//#ifndef QT_NO_DATASTREAM
friend GKEXPORT QDataStream &operator<<( QDataStream &, const GKTimeDuration & );
friend GKEXPORT QDataStream &operator>>( QDataStream &, GKTimeDuration & );
//#endif
};
GKEXPORT QDataStream &operator<<( QDataStream &, const GKTimeDuration & );
GKEXPORT QDataStream &operator>>( QDataStream &, GKTimeDuration & );
#endif