]> git.saurik.com Git - wxWidgets.git/blame_incremental - include/wx/datetime.h
define wxCHECK_W32API_VERSION for OpenWatcom and DigitalMars
[wxWidgets.git] / include / wx / datetime.h
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: wx/datetime.h
3// Purpose: declarations of time/date related classes (wxDateTime,
4// wxTimeSpan)
5// Author: Vadim Zeitlin
6// Modified by:
7// Created: 10.02.99
8// RCS-ID: $Id$
9// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
10// Licence: wxWindows licence
11/////////////////////////////////////////////////////////////////////////////
12
13#ifndef _WX_DATETIME_H
14#define _WX_DATETIME_H
15
16#if defined(__GNUG__) && !defined(__APPLE__)
17 #pragma interface "datetime.h"
18#endif
19
20#include "wx/defs.h"
21
22#if wxUSE_DATETIME
23
24#include <time.h>
25#include <limits.h> // for INT_MIN
26
27#include "wx/longlong.h"
28
29class WXDLLIMPEXP_BASE wxDateTime;
30class WXDLLIMPEXP_BASE wxTimeSpan;
31class WXDLLIMPEXP_BASE wxDateSpan;
32
33// a hack: don't use inline functions in debug builds - we don't care about
34// performances and this only leads to increased rebuild time (because every
35// time an inline method is changed, all files including the header must be
36// rebuilt)
37
38// For Mingw32, causes a link error. (VZ: why?)
39#if defined( __WXDEBUG__) && !defined(__MINGW32__) && !(defined(_MSC_VER) && wxUSE_ACCESSIBILITY)
40 #define wxDATETIME_DONT_INLINE
41
42 #undef inline
43 #define inline
44#else
45 // just in case
46 #undef wxDATETIME_DONT_INLINE
47#endif // Debug
48
49// not all c-runtimes are based on 1/1/1970 being (time_t) 0
50// set this to the corresponding value in seconds 1/1/1970 has on your
51// systems c-runtime
52
53#if defined(__WXMAC__) && !defined(__DARWIN__) && __MSL__ < 0x6000
54 #define WX_TIME_BASE_OFFSET ( 2082844800L + 126144000L )
55#else
56 #define WX_TIME_BASE_OFFSET 0
57#endif
58/*
59 * TODO
60 *
61 * + 1. Time zones with minutes (make TimeZone a class)
62 * ? 2. getdate() function like under Solaris
63 * + 3. text conversion for wxDateSpan
64 * + 4. pluggable modules for the workdays calculations
65 * 5. wxDateTimeHolidayAuthority for Easter and other christian feasts
66 */
67
68/*
69 The three (main) classes declared in this header represent:
70
71 1. An absolute moment in the time (wxDateTime)
72 2. A difference between two moments in the time, positive or negative
73 (wxTimeSpan)
74 3. A logical difference between two dates expressed in
75 years/months/weeks/days (wxDateSpan)
76
77 The following arithmetic operations are permitted (all others are not):
78
79 addition
80 --------
81
82 wxDateTime + wxTimeSpan = wxDateTime
83 wxDateTime + wxDateSpan = wxDateTime
84 wxTimeSpan + wxTimeSpan = wxTimeSpan
85 wxDateSpan + wxDateSpan = wxDateSpan
86
87 subtraction
88 ------------
89 wxDateTime - wxDateTime = wxTimeSpan
90 wxDateTime - wxTimeSpan = wxDateTime
91 wxDateTime - wxDateSpan = wxDateTime
92 wxTimeSpan - wxTimeSpan = wxTimeSpan
93 wxDateSpan - wxDateSpan = wxDateSpan
94
95 multiplication
96 --------------
97 wxTimeSpan * number = wxTimeSpan
98 number * wxTimeSpan = wxTimeSpan
99 wxDateSpan * number = wxDateSpan
100 number * wxDateSpan = wxDateSpan
101
102 unitary minus
103 -------------
104 -wxTimeSpan = wxTimeSpan
105 -wxDateSpan = wxDateSpan
106
107 For each binary operation OP (+, -, *) we have the following operatorOP=() as
108 a method and the method with a symbolic name OPER (Add, Subtract, Multiply)
109 as a synonym for it and another const method with the same name which returns
110 the changed copy of the object and operatorOP() as a global function which is
111 implemented in terms of the const version of OPEN. For the unary - we have
112 operator-() as a method, Neg() as synonym for it and Negate() which returns
113 the copy of the object with the changed sign.
114*/
115
116// an invalid/default date time object which may be used as the default
117// argument for arguments of type wxDateTime; it is also returned by all
118// functions returning wxDateTime on failure (this is why it is also called
119// wxInvalidDateTime)
120class WXDLLIMPEXP_BASE wxDateTime;
121
122extern WXDLLIMPEXP_DATA_BASE(const wxDateTime) wxDefaultDateTime;
123#define wxInvalidDateTime wxDefaultDateTime
124
125// ----------------------------------------------------------------------------
126// wxDateTime represents an absolute moment in the time
127// ----------------------------------------------------------------------------
128
129class WXDLLIMPEXP_BASE wxDateTime
130{
131public:
132 // types
133 // ------------------------------------------------------------------------
134
135 // a small unsigned integer type for storing things like minutes,
136 // seconds &c. It should be at least short (i.e. not char) to contain
137 // the number of milliseconds - it may also be 'int' because there is
138 // no size penalty associated with it in our code, we don't store any
139 // data in this format
140 typedef unsigned short wxDateTime_t;
141
142 // constants
143 // ------------------------------------------------------------------------
144
145 // the timezones
146 enum TZ
147 {
148 // the time in the current time zone
149 Local,
150
151 // zones from GMT (= Greenwhich Mean Time): they're guaranteed to be
152 // consequent numbers, so writing something like `GMT0 + offset' is
153 // safe if abs(offset) <= 12
154
155 // underscore stands for minus
156 GMT_12, GMT_11, GMT_10, GMT_9, GMT_8, GMT_7,
157 GMT_6, GMT_5, GMT_4, GMT_3, GMT_2, GMT_1,
158 GMT0,
159 GMT1, GMT2, GMT3, GMT4, GMT5, GMT6,
160 GMT7, GMT8, GMT9, GMT10, GMT11, GMT12,
161 // Note that GMT12 and GMT_12 are not the same: there is a difference
162 // of exactly one day between them
163
164 // some symbolic names for TZ
165
166 // Europe
167 WET = GMT0, // Western Europe Time
168 WEST = GMT1, // Western Europe Summer Time
169 CET = GMT1, // Central Europe Time
170 CEST = GMT2, // Central Europe Summer Time
171 EET = GMT2, // Eastern Europe Time
172 EEST = GMT3, // Eastern Europe Summer Time
173 MSK = GMT3, // Moscow Time
174 MSD = GMT4, // Moscow Summer Time
175
176 // US and Canada
177 AST = GMT_4, // Atlantic Standard Time
178 ADT = GMT_3, // Atlantic Daylight Time
179 EST = GMT_5, // Eastern Standard Time
180 EDT = GMT_4, // Eastern Daylight Saving Time
181 CST = GMT_6, // Central Standard Time
182 CDT = GMT_5, // Central Daylight Saving Time
183 MST = GMT_7, // Mountain Standard Time
184 MDT = GMT_6, // Mountain Daylight Saving Time
185 PST = GMT_8, // Pacific Standard Time
186 PDT = GMT_7, // Pacific Daylight Saving Time
187 HST = GMT_10, // Hawaiian Standard Time
188 AKST = GMT_9, // Alaska Standard Time
189 AKDT = GMT_8, // Alaska Daylight Saving Time
190
191 // Australia
192
193 A_WST = GMT8, // Western Standard Time
194 A_CST = GMT12 + 1, // Central Standard Time (+9.5)
195 A_EST = GMT10, // Eastern Standard Time
196 A_ESST = GMT11, // Eastern Summer Time
197
198 // TODO add more symbolic timezone names here
199
200 // Universal Coordinated Time = the new and politically correct name
201 // for GMT
202 UTC = GMT0
203 };
204
205 // the calendar systems we know about: notice that it's valid (for
206 // this classes purpose anyhow) to work with any of these calendars
207 // even with the dates before the historical appearance of the
208 // calendar
209 enum Calendar
210 {
211 Gregorian, // current calendar
212 Julian // calendar in use since -45 until the 1582 (or later)
213
214 // TODO Hebrew, Chinese, Maya, ... (just kidding) (or then may be not?)
215 };
216
217 // these values only are used to identify the different dates of
218 // adoption of the Gregorian calendar (see IsGregorian())
219 //
220 // All data and comments taken verbatim from "The Calendar FAQ (v 2.0)"
221