xref: /haiku/headers/os/support/DateTime.h (revision daf3c505296ff7043b13af0d64fdeb5edfd39cdf)
1a070cf53SStephan Aßmus /*
2a070cf53SStephan Aßmus  * Copyright 2007-2010, Haiku, Inc. All Rights Reserved.
3a070cf53SStephan Aßmus  * Distributed under the terms of the MIT License.
4a070cf53SStephan Aßmus  */
5a070cf53SStephan Aßmus #ifndef _DATE_TIME_H_
6a070cf53SStephan Aßmus #define _DATE_TIME_H_
7a070cf53SStephan Aßmus 
8a070cf53SStephan Aßmus 
9a070cf53SStephan Aßmus #include <String.h>
10a070cf53SStephan Aßmus 
11a070cf53SStephan Aßmus 
12a070cf53SStephan Aßmus class BMessage;
13a070cf53SStephan Aßmus 
14a070cf53SStephan Aßmus 
15a070cf53SStephan Aßmus namespace BPrivate {
16a070cf53SStephan Aßmus 
17a070cf53SStephan Aßmus 
18a070cf53SStephan Aßmus enum time_type {
19a070cf53SStephan Aßmus 	B_GMT_TIME,
20a070cf53SStephan Aßmus 	B_LOCAL_TIME
21a070cf53SStephan Aßmus };
22a070cf53SStephan Aßmus 
23a070cf53SStephan Aßmus 
24a070cf53SStephan Aßmus enum diff_type {
25a070cf53SStephan Aßmus 	B_HOURS_DIFF,
26a070cf53SStephan Aßmus 	B_MINUTES_DIFF,
27a070cf53SStephan Aßmus 	B_SECONDS_DIFF,
28a070cf53SStephan Aßmus 	B_MILLISECONDS_DIFF,
29a070cf53SStephan Aßmus 	B_MICROSECONDS_DIFF
30a070cf53SStephan Aßmus };
31a070cf53SStephan Aßmus 
32a070cf53SStephan Aßmus 
33a070cf53SStephan Aßmus class BTime {
34a070cf53SStephan Aßmus public:
35a070cf53SStephan Aßmus 								BTime();
36bbba047cSStephan Aßmus 								BTime(const BTime& other);
37a070cf53SStephan Aßmus 								BTime(int32 hour, int32 minute, int32 second,
38a070cf53SStephan Aßmus 									int32 microsecond = 0);
39a070cf53SStephan Aßmus 								BTime(const BMessage* archive);
40a070cf53SStephan Aßmus 								~BTime();
41a070cf53SStephan Aßmus 
42a070cf53SStephan Aßmus 			status_t			Archive(BMessage* into) const;
43a070cf53SStephan Aßmus 
44a070cf53SStephan Aßmus 			bool				IsValid() const;
45*daf3c505SJérôme Duval 	static	bool				IsValid(const BTime& time);
46*daf3c505SJérôme Duval 	static	bool				IsValid(int32 hour, int32 minute, int32 second,
47*daf3c505SJérôme Duval 									int32 microsecond = 0);
48a070cf53SStephan Aßmus 
49a070cf53SStephan Aßmus 	static	BTime				CurrentTime(time_type type);
50a070cf53SStephan Aßmus 
51a070cf53SStephan Aßmus 			BTime				Time() const;
52a070cf53SStephan Aßmus 			bool				SetTime(const BTime& time);
53a070cf53SStephan Aßmus 			bool				SetTime(int32 hour, int32 minute, int32 second,
54a070cf53SStephan Aßmus 									int32 microsecond = 0);
55a070cf53SStephan Aßmus 
56bbba047cSStephan Aßmus 			BTime&				AddHours(int32 hours);
57bbba047cSStephan Aßmus 			BTime&				AddMinutes(int32 minutes);
58bbba047cSStephan Aßmus 			BTime&				AddSeconds(int32 seconds);
59bbba047cSStephan Aßmus 			BTime&				AddMilliseconds(int32 milliseconds);
60bbba047cSStephan Aßmus 			BTime&				AddMicroseconds(int32 microseconds);
61a070cf53SStephan Aßmus 
62a070cf53SStephan Aßmus 			int32				Hour() const;
63a070cf53SStephan Aßmus 			int32				Minute() const;
64a070cf53SStephan Aßmus 			int32				Second() const;
65a070cf53SStephan Aßmus 			int32				Millisecond() const;
66a070cf53SStephan Aßmus 			int32				Microsecond() const;
67a070cf53SStephan Aßmus 			bigtime_t			Difference(const BTime& time,
68a070cf53SStephan Aßmus 									diff_type type) const;
69a070cf53SStephan Aßmus 
70a070cf53SStephan Aßmus 			bool				operator!=(const BTime& time) const;
71a070cf53SStephan Aßmus 			bool				operator==(const BTime& time) const;
72a070cf53SStephan Aßmus 
73a070cf53SStephan Aßmus 			bool				operator<(const BTime& time) const;
74a070cf53SStephan Aßmus 			bool				operator<=(const BTime& time) const;
75a070cf53SStephan Aßmus 
76a070cf53SStephan Aßmus 			bool				operator>(const BTime& time) const;
77a070cf53SStephan Aßmus 			bool				operator>=(const BTime& time) const;
78a070cf53SStephan Aßmus 
79a070cf53SStephan Aßmus private:
80a070cf53SStephan Aßmus 			bigtime_t			_Microseconds() const;
81bbba047cSStephan Aßmus 			BTime&				_AddMicroseconds(bigtime_t microseconds);
82a070cf53SStephan Aßmus 			bool				_SetTime(bigtime_t hour, bigtime_t minute,
83a070cf53SStephan Aßmus 									bigtime_t second, bigtime_t microsecond);
84a070cf53SStephan Aßmus 
85a070cf53SStephan Aßmus private:
86a070cf53SStephan Aßmus 			bigtime_t			fMicroseconds;
87a070cf53SStephan Aßmus };
88a070cf53SStephan Aßmus 
89a070cf53SStephan Aßmus 
90a070cf53SStephan Aßmus class BDate {
91a070cf53SStephan Aßmus public:
92a070cf53SStephan Aßmus 								BDate();
93bbba047cSStephan Aßmus 								BDate(const BDate& other);
94a070cf53SStephan Aßmus 								BDate(int32 year, int32 month, int32 day);
95a070cf53SStephan Aßmus 								BDate(const BMessage* archive);
96a070cf53SStephan Aßmus 								~BDate();
97a070cf53SStephan Aßmus 
98a070cf53SStephan Aßmus 			status_t			Archive(BMessage* into) const;
99a070cf53SStephan Aßmus 
100a070cf53SStephan Aßmus 			bool				IsValid() const;
101*daf3c505SJérôme Duval 	static	bool				IsValid(const BDate& date);
102*daf3c505SJérôme Duval 	static	bool				IsValid(int32 year, int32 month,
103*daf3c505SJérôme Duval 									int32 day);
104a070cf53SStephan Aßmus 
105a070cf53SStephan Aßmus 	static	BDate				CurrentDate(time_type type);
106a070cf53SStephan Aßmus 
107a070cf53SStephan Aßmus 			BDate				Date() const;
108a070cf53SStephan Aßmus 			bool				SetDate(const BDate& date);
109a070cf53SStephan Aßmus 
110a070cf53SStephan Aßmus 			bool				SetDate(int32 year, int32 month, int32 day);
111*daf3c505SJérôme Duval 			void				GetDate(int32* year, int32* month,
112*daf3c505SJérôme Duval 									int32* day) const;
113a070cf53SStephan Aßmus 
114a070cf53SStephan Aßmus 			void				AddDays(int32 days);
115a070cf53SStephan Aßmus 			void				AddYears(int32 years);
116a070cf53SStephan Aßmus 			void				AddMonths(int32 months);
117a070cf53SStephan Aßmus 
118a070cf53SStephan Aßmus 			int32				Day() const;
119a070cf53SStephan Aßmus 			int32				Year() const;
120a070cf53SStephan Aßmus 			int32				Month() const;
121a070cf53SStephan Aßmus 			int32				Difference(const BDate& date) const;
122a070cf53SStephan Aßmus 
123a070cf53SStephan Aßmus 			int32				DayOfWeek() const;
124a070cf53SStephan Aßmus 			int32				DayOfYear() const;
125a070cf53SStephan Aßmus 
126a070cf53SStephan Aßmus 			int32				WeekNumber() const;
127*daf3c505SJérôme Duval 			bool				IsLeapYear() const;
128*daf3c505SJérôme Duval 	static	bool				IsLeapYear(int32 year);
129a070cf53SStephan Aßmus 
130a070cf53SStephan Aßmus 			int32				DaysInYear() const;
131a070cf53SStephan Aßmus 			int32				DaysInMonth() const;
132a070cf53SStephan Aßmus 
133bbba047cSStephan Aßmus 			BString				ShortDayName() const;
134bbba047cSStephan Aßmus 	static	BString				ShortDayName(int32 day);
135a070cf53SStephan Aßmus 
136bbba047cSStephan Aßmus 			BString				ShortMonthName() const;
137bbba047cSStephan Aßmus 	static	BString				ShortMonthName(int32 month);
138bbba047cSStephan Aßmus 
139bbba047cSStephan Aßmus 			BString				LongDayName() const;
140bbba047cSStephan Aßmus 	static	BString				LongDayName(int32 day);
141bbba047cSStephan Aßmus 
142bbba047cSStephan Aßmus 			BString				LongMonthName() const;
143bbba047cSStephan Aßmus 	static	BString				LongMonthName(int32 month);
144a070cf53SStephan Aßmus 
145a070cf53SStephan Aßmus 			int32				DateToJulianDay() const;
146a070cf53SStephan Aßmus 	static	BDate				JulianDayToDate(int32 julianDay);
147a070cf53SStephan Aßmus 
148*daf3c505SJérôme Duval 	static	BDate				EasterSunday(int32 year);
149*daf3c505SJérôme Duval 	static	BDate				AscensionDay(int32 year);
150*daf3c505SJérôme Duval 	static	BDate				PentecostDay(int32 year);
151*daf3c505SJérôme Duval 
152a070cf53SStephan Aßmus 			bool				operator!=(const BDate& date) const;
153a070cf53SStephan Aßmus 			bool				operator==(const BDate& date) const;
154a070cf53SStephan Aßmus 
155a070cf53SStephan Aßmus 			bool				operator<(const BDate& date) const;
156a070cf53SStephan Aßmus 			bool				operator<=(const BDate& date) const;
157a070cf53SStephan Aßmus 
158a070cf53SStephan Aßmus 			bool				operator>(const BDate& date) const;
159a070cf53SStephan Aßmus 			bool				operator>=(const BDate& date) const;
160a070cf53SStephan Aßmus 
161a070cf53SStephan Aßmus private:
162*daf3c505SJérôme Duval 	static	int32				_DaysInMonth(int32 year, int32 month);
163a070cf53SStephan Aßmus 			bool				_SetDate(int32 year, int32 month, int32 day);
164*daf3c505SJérôme Duval 	static	int32				_DateToJulianDay(int32 year, int32 month,
165*daf3c505SJérôme Duval 									int32 day);
166a070cf53SStephan Aßmus 
167a070cf53SStephan Aßmus private:
168a070cf53SStephan Aßmus 			int32				fDay;
169a070cf53SStephan Aßmus 			int32				fYear;
170a070cf53SStephan Aßmus 			int32				fMonth;
171a070cf53SStephan Aßmus };
172a070cf53SStephan Aßmus 
173a070cf53SStephan Aßmus 
174a070cf53SStephan Aßmus class BDateTime {
175a070cf53SStephan Aßmus public:
176a070cf53SStephan Aßmus 								BDateTime();
177a070cf53SStephan Aßmus 								BDateTime(const BDate &date, const BTime &time);
178a070cf53SStephan Aßmus 								BDateTime(const BMessage* archive);
179a070cf53SStephan Aßmus 								~BDateTime();
180a070cf53SStephan Aßmus 
181a070cf53SStephan Aßmus 			status_t			Archive(BMessage* into) const;
182a070cf53SStephan Aßmus 
183a070cf53SStephan Aßmus 			bool				IsValid() const;
184a070cf53SStephan Aßmus 
185a070cf53SStephan Aßmus 	static	BDateTime			CurrentDateTime(time_type type);
186a070cf53SStephan Aßmus 			void				SetDateTime(const BDate &date, const BTime &time);
187a070cf53SStephan Aßmus 
188bbba047cSStephan Aßmus 			BDate&				Date();
189bbba047cSStephan Aßmus 			const BDate&		Date() const;
190a070cf53SStephan Aßmus 			void				SetDate(const BDate &date);
191a070cf53SStephan Aßmus 
192bbba047cSStephan Aßmus 			BTime&				Time();
193bbba047cSStephan Aßmus 			const BTime&		Time() const;
194a070cf53SStephan Aßmus 			void				SetTime(const BTime &time);
195a070cf53SStephan Aßmus 
196a070cf53SStephan Aßmus 			int32				Time_t() const;
197a070cf53SStephan Aßmus 			void				SetTime_t(uint32 seconds);
198a070cf53SStephan Aßmus 
199a070cf53SStephan Aßmus 			bool				operator!=(const BDateTime& dateTime) const;
200a070cf53SStephan Aßmus 			bool				operator==(const BDateTime& dateTime) const;
201a070cf53SStephan Aßmus 
202a070cf53SStephan Aßmus 			bool				operator<(const BDateTime& dateTime) const;
203a070cf53SStephan Aßmus 			bool				operator<=(const BDateTime& dateTime) const;
204a070cf53SStephan Aßmus 
205a070cf53SStephan Aßmus 			bool				operator>(const BDateTime& dateTime) const;
206a070cf53SStephan Aßmus 			bool				operator>=(const BDateTime& dateTime) const;
207a070cf53SStephan Aßmus 
208a070cf53SStephan Aßmus private:
209a070cf53SStephan Aßmus 			BDate				fDate;
210a070cf53SStephan Aßmus 			BTime				fTime;
211a070cf53SStephan Aßmus };
212a070cf53SStephan Aßmus 
213a070cf53SStephan Aßmus 
214a070cf53SStephan Aßmus }	// namespace BPrivate
215a070cf53SStephan Aßmus 
216a070cf53SStephan Aßmus 
217a070cf53SStephan Aßmus using BPrivate::time_type;
218a070cf53SStephan Aßmus using BPrivate::B_GMT_TIME;
219a070cf53SStephan Aßmus using BPrivate::B_LOCAL_TIME;
220a070cf53SStephan Aßmus using BPrivate::diff_type;
221a070cf53SStephan Aßmus using BPrivate::B_HOURS_DIFF;
222a070cf53SStephan Aßmus using BPrivate::B_MINUTES_DIFF;
223a070cf53SStephan Aßmus using BPrivate::B_SECONDS_DIFF;
224a070cf53SStephan Aßmus using BPrivate::B_MILLISECONDS_DIFF;
225a070cf53SStephan Aßmus using BPrivate::B_MICROSECONDS_DIFF;
226a070cf53SStephan Aßmus using BPrivate::BTime;
227a070cf53SStephan Aßmus using BPrivate::BDate;
228a070cf53SStephan Aßmus using BPrivate::BDateTime;
229a070cf53SStephan Aßmus 
230a070cf53SStephan Aßmus 
231a070cf53SStephan Aßmus #endif	// _DATE_TIME_H_
232