00001 /* 00002 * Timestamp.h 00003 * 00004 * Smalltalk like class library for C++ 00005 * Timestamp. Header. 00006 * 00007 * Copyright (c) 2005 Milan Cermak 00008 */ 00009 /* 00010 * This library is free software; you can redistribute it and/or 00011 * modify it under the terms of the GNU Lesser General Public 00012 * License as published by the Free Software Foundation; either 00013 * version 2.1 of the License, or (at your option) any later version. 00014 * 00015 * This library is distributed in the hope that it will be useful, 00016 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00018 * Lesser General Public License for more details. 00019 * 00020 * You should have received a copy of the GNU Lesser General Public 00021 * License along with this library; if not, write to the Free Software 00022 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00023 */ 00024 #ifndef __TIMESTAMP_H 00025 #define __TIMESTAMP_H 00026 00027 #include <time.h> 00028 #include <stlib/Object.h> 00029 00030 namespace Core { 00031 00032 class Date; 00033 class Time; 00034 00035 class Timestamp : public Object 00036 { 00037 protected: 00038 struct _timestamp_t { 00039 unsigned int milliseconds : 10; 00040 unsigned int seconds : 6; 00041 unsigned int minutes : 6; 00042 unsigned int hours : 5; 00043 unsigned int day : 5; 00044 unsigned int month : 4; 00045 unsigned int year : 28; 00046 } _timestamp; 00047 00048 public: 00049 Timestamp(int month = 1, int day = 1, int year = 1900, 00050 int hour = 0, int minute = 0, int second = 0, int millisecond = 0); 00051 00052 /* Class-accessing protocol */ 00053 virtual String *className(void) const; 00054 00055 /* Instance creating protocol */ 00057 static Timestamp *now(void); 00058 static Timestamp *fromUnixTimestamp(time_t timestamp); 00059 static Timestamp *fromDateAndTime(Date *date, Time *time); 00060 00061 /* Accessing protocol */ 00063 virtual int month(void) const; 00065 virtual int day(void) const; 00067 virtual int year(void) const; 00069 virtual int weekday(void) const; 00071 virtual int century(void) const; 00072 virtual int hour(void) const; 00073 virtual int minute(void) const; 00074 virtual int second(void) const; 00075 virtual int millisecond(void) const; 00076 00077 /* Arithmetics protocol */ 00078 virtual Timestamp *addDays(int dayCount); 00079 virtual Timestamp *addMonths(int monthCount); 00080 virtual Timestamp *addYears(int yearCount); 00081 virtual Timestamp *addHours(int hours); 00082 virtual Timestamp *addMinutes(int minutes); 00083 virtual Timestamp *addSeconds(int seconds); 00084 virtual Timestamp *addMilliseconds(int millis); 00085 00086 virtual Timestamp *subtractDays(int dayCount); 00087 virtual Timestamp *subtractMonths(int monthCount); 00088 virtual Timestamp *subtractYears(int yearCount); 00089 virtual Timestamp *subtractHours(int hours); 00090 virtual Timestamp *subtractMinutes(int minutes); 00091 virtual Timestamp *subtractSeconds(int seconds); 00092 virtual Timestamp *subtractMilliseconds(int millis); 00093 00094 virtual Time *differenceFrom(Timestamp *stamp); 00095 00096 /* Comparing protocol */ 00097 virtual long hash(void) const; 00098 virtual bool isEqual(const Object *object) const; 00099 virtual bool isEqual(const Object &object) const 00100 { return Object::isEqual(object); } 00101 00102 /* Converting protocol */ 00104 virtual Date *asDate(void) const; 00106 virtual Time *asTime(void) const; 00107 virtual time_t asUnixTimestamp(void) const; 00108 00109 /* Printing protocol */ 00110 virtual void printOn(Stream *stream) const; 00111 00112 /* Testing protocol */ 00114 virtual bool isLeapYear(void) const; 00115 }; 00116 00117 }; 00118 00119 #endif /* __TIMESTAMP_H */