00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdlib.h>
00025 #include <time.h>
00026 #include <sys/time.h>
00027 #include <stlib/String.h>
00028 #include <stlib/Stream.h>
00029 #include <stlib/Time.h>
00030
00031 Time::Time(int hour, int minute, int second, int milli)
00032 {
00033 _hours = hour;
00034 _minutes = minute;
00035 _seconds = second;
00036 _milliseconds = milli;
00037 }
00038
00039
00040 String *Time::className(void) const
00041 {
00042 return new String("Time");
00043 }
00044
00045
00047 Time *Time::now()
00048 {
00049 struct timeval timestamp;
00050 struct timezone tz;
00051
00052 gettimeofday(×tamp, &tz);
00053 const struct tm* time = localtime(×tamp.tv_sec);
00054 return new Time(time->tm_hour, time->tm_min, time->tm_sec,
00055 timestamp.tv_usec/1000);
00056 }
00057
00059 Time *Time::midnight()
00060 {
00061 return Time::zero();
00062 }
00063
00064 Time *Time::zero()
00065 {
00066 return new Time;
00067 }
00068
00069
00070 int Time::hour(void) const
00071 {
00072 return _hours;
00073 }
00074
00075 int Time::minute(void) const
00076 {
00077 return _minutes;
00078 }
00079
00080 int Time::second(void) const
00081 {
00082 return _seconds;
00083 }
00084
00085 int Time::millisecond(void) const
00086 {
00087 return _milliseconds;
00088 }
00089
00090
00092 Time *Time::addHours(int hours)
00093 {
00094 return new Time(_hours + hours, _minutes, _seconds, _milliseconds);
00095 }
00096
00098 Time *Time::addMinutes(int minutes)
00099 {
00100 return addSeconds(minutes * 60);
00101 }
00102
00104 Time *Time::addSeconds(int seconds)
00105 {
00106 return addMilliseconds(seconds * 1000);
00107 }
00108
00112 Time *Time::addMilliseconds(int millis)
00113 {
00114 int hours, minutes, seconds;
00115 millis += _milliseconds;
00116 seconds = _seconds + millis / 1000;
00117 minutes = _minutes + seconds / 60;
00118 hours = _hours + minutes / 60;
00119 minutes = minutes % 60;
00120 seconds = seconds % 60;
00121 millis = millis % 1000;
00122 return new Time(hours, minutes, seconds, millis);
00123 }
00124
00125 Time *Time::subtractHours(int hours)
00126 {
00127 return new Time(_hours - hours, _minutes, _seconds, _milliseconds);
00128 }
00129
00130 Time *Time::subtractMinutes(int minutes)
00131 {
00132 return subtractSeconds(minutes * 60);
00133 }
00134
00135 Time *Time::subtractSeconds(int seconds)
00136 {
00137 return subtractMilliseconds(seconds * 1000);
00138 }
00139
00140 Time *Time::subtractMilliseconds(int millis)
00141 {
00142 int seconds = millis / 1000;
00143 millis = _milliseconds - millis % 1000;
00144 while (millis < 1000) {
00145 seconds++; millis -= 1000;
00146 }
00147 int minutes = seconds / 60;
00148 seconds = _seconds - seconds % 60;
00149 while (seconds < 60) {
00150 minutes++; seconds -= 60;
00151 }
00152 int hours = minutes / 60;
00153 minutes = _minutes - minutes % 60;
00154 while (minutes < 60) {
00155 hours++; minutes -= 60;
00156 }
00157 hours = _hours - hours;
00158 return new Time(hours, minutes, seconds, millis);
00159 }
00160
00161 Time *Time::differenceFrom(Time *time)
00162 {
00163 unsigned long millis = abs(asMilliseconds() - time->asMilliseconds());
00164 return Time::zero()->addMilliseconds(millis);
00165 }
00166
00167
00168 long Time::hash(void) const
00169 {
00170 long hashVal = _hours;
00171 hashVal += _minutes << 10;
00172 hashVal += _seconds << 16;
00173 hashVal += _milliseconds << 22;
00174 }
00175
00176 bool Time::isEqual(const Object *object) const
00177 {
00178 if (!object->className()->isEqual(className())) return false;
00179
00180 const Time *t = dynamic_cast<const Time *>(object);
00181 return t->_hours == this->_hours &&
00182 t->_minutes == this->_minutes &&
00183 t->_seconds == this->_seconds &&
00184 t->_milliseconds == this->_milliseconds;
00185 }
00186
00187
00188 unsigned long Time::asMilliseconds(void) const
00189 {
00190 return ((_hours * 60 + _minutes) * 60 + _seconds) * 1000 + _milliseconds;
00191 }
00192
00193
00194 void Time::printOn(Stream *stream) const
00195 {
00196 String *timeStr;
00197 timeStr = String::format("%u:%02u:%02u.%03u",
00198 hour(), minute(), second(), millisecond());
00199 stream->nextPutAll(timeStr);
00200 }