145 lines
3.3 KiB
C++
145 lines
3.3 KiB
C++
/*
|
|
* Copyright 1995, 1996 Perforce Software. All rights reserved.
|
|
*
|
|
* This file is part of Perforce - the FAST SCM System.
|
|
*/
|
|
|
|
/*
|
|
* DateTime - get and set the date as a string
|
|
*/
|
|
|
|
// size for Fmt, FmtDay
|
|
|
|
# define DateTimeBufSize 20
|
|
|
|
// size for FmtTz, which can say things like '0700 - Pacific Standard Time'
|
|
|
|
# define DateTimeZoneBufSize 80
|
|
|
|
class DateTime {
|
|
|
|
public:
|
|
DateTime() {}
|
|
DateTime( const int date ) { Set( date ); }
|
|
DateTime( const char *date, Error *e ) { Set( date, e ); }
|
|
|
|
void Set( const char *date, Error *e );
|
|
void Set( const int date ) { wholeDay = 0; tval = (time_t)date; }
|
|
void SetNow() { Set( (int)Now() ); }
|
|
|
|
int Compare( const DateTime &t2 ) const {
|
|
return (int)(tval - t2.tval); };
|
|
|
|
void Fmt( char *buf ) const;
|
|
void FmtDay( char *buf ) const;
|
|
void FmtDayUTC( char *buf ) const;
|
|
void FmtTz( char *buf ) const;
|
|
void FmtUTC( char *buf ) const;
|
|
void FmtElapsed( char *buf, const DateTime &t2 );
|
|
void FmtUnifiedDiff( char *buf ) const;
|
|
|
|
int Value() const { return (int)tval; }
|
|
int Tomorrow() const { return (int)tval + 24*60*60; }
|
|
int IsWholeDay() const { return wholeDay; }
|
|
|
|
static int Never() { return 0; }
|
|
static int Forever() { return 2147483647; }
|
|
|
|
// for stat() and utime() conversion
|
|
|
|
static time_t Localize( time_t centralTime );
|
|
static time_t Centralize( time_t localTime );
|
|
int TzOffset( int *isdst = 0 ) const;
|
|
|
|
protected:
|
|
time_t Now();
|
|
|
|
private:
|
|
time_t tval;
|
|
int wholeDay;
|
|
|
|
int ParseOffset( const char *s, const char *odate, Error *e );
|
|
};
|
|
|
|
class DateTimeNow : public DateTime {
|
|
|
|
public:
|
|
DateTimeNow() { Set( Now() ); }
|
|
|
|
} ;
|
|
|
|
// Pass a buffer of at least this size to DateTimeHighPrecision::Fmt():
|
|
|
|
# define DTHighPrecisionBufSize 40
|
|
|
|
/*
|
|
* Uses gettimeofday/clock_gettime/etc. to find more precise system time
|
|
*/
|
|
class DateTimeHighPrecision
|
|
{
|
|
public:
|
|
|
|
// Orthodox Canonical Form (OCF) methods (we don't need a dtor)
|
|
DateTimeHighPrecision(time_t secs = 0, int nsecs = 0)
|
|
: seconds( secs ), nanos( nsecs ) { }
|
|
|
|
DateTimeHighPrecision(const DateTimeHighPrecision &rhs)
|
|
: seconds( rhs.seconds ), nanos( rhs.nanos ) { }
|
|
|
|
DateTimeHighPrecision &
|
|
operator=( const DateTimeHighPrecision &rhs );
|
|
|
|
DateTimeHighPrecision &
|
|
operator+=( const DateTimeHighPrecision &rhs );
|
|
|
|
DateTimeHighPrecision &
|
|
operator-=( const DateTimeHighPrecision &rhs );
|
|
|
|
bool
|
|
operator==(
|
|
const DateTimeHighPrecision &rhs) const;
|
|
|
|
bool
|
|
operator!=(
|
|
const DateTimeHighPrecision &rhs) const;
|
|
|
|
bool
|
|
operator<(
|
|
const DateTimeHighPrecision &rhs) const;
|
|
|
|
bool
|
|
operator<=(
|
|
const DateTimeHighPrecision &rhs) const;
|
|
|
|
bool
|
|
operator>(
|
|
const DateTimeHighPrecision &rhs) const;
|
|
|
|
bool
|
|
operator>=(
|
|
const DateTimeHighPrecision &rhs) const;
|
|
|
|
void Now();
|
|
void Fmt( char *buf ) const;
|
|
|
|
time_t Seconds() const;
|
|
int Nanos() const;
|
|
|
|
bool IsZero() const { return seconds == 0 && nanos == 0; }
|
|
|
|
// return (t2 - *this) in nanoseconds
|
|
P4INT64 ElapsedNanos( const DateTimeHighPrecision &t2 ) const;
|
|
|
|
void FmtElapsed( StrBuf &buf, const DateTimeHighPrecision t2 ) const;
|
|
// return < 0, = 0, or > 0 if *this < rhs, *this == rhs, or *this > rhs, respectively
|
|
int Compare( const DateTimeHighPrecision &rhs ) const;
|
|
|
|
private:
|
|
|
|
P4INT64 ToNanos() const;
|
|
|
|
time_t seconds; // Since 1/1/1970, natch
|
|
int nanos;
|
|
} ;
|
|
|