1 | /* |
2 | * datetime.cpp - date/time with start-of-day time for date-only values |
3 | * This file is part of kalarmcal library, which provides access to KAlarm |
4 | * calendar data. |
5 | * Copyright © 2003,2005-2007,2009-2011 by David Jarvie <djarvie@kde.org> |
6 | * |
7 | * This library is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU Library General Public License as published |
9 | * by the Free Software Foundation; either version 2 of the License, or (at |
10 | * your option) any later version. |
11 | * |
12 | * This library is distributed in the hope that it will be useful, but WITHOUT |
13 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
14 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public |
15 | * License for more details. |
16 | * |
17 | * You should have received a copy of the GNU Library General Public License |
18 | * along with this library; see the file COPYING.LIB. If not, write to the |
19 | * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, |
20 | * MA 02110-1301, USA. |
21 | */ |
22 | #include "datetime.h" |
23 | |
24 | #include <kglobal.h> |
25 | #include <klocale.h> |
26 | #include <klocalizedstring.h> |
27 | #include <ktimezone.h> |
28 | |
29 | #include <QDateTime> |
30 | |
31 | namespace KAlarmCal |
32 | { |
33 | |
34 | class DateTime::Private |
35 | { |
36 | public: |
37 | Private() {} |
38 | Private(const QDate& d, const KDateTime::Spec& spec) : mDateTime(d, spec) {} |
39 | Private(const QDate& d, const QTime& t, const KDateTime::Spec& spec) : mDateTime(d, t, spec) {} |
40 | Private(const QDateTime& dt, const KDateTime::Spec& spec) : mDateTime(dt, spec) {} |
41 | Private(const KDateTime& dt) : mDateTime(dt) {} |
42 | |
43 | static QTime mStartOfDay; |
44 | KDateTime mDateTime; |
45 | }; |
46 | |
47 | QTime DateTime::Private::mStartOfDay; |
48 | |
49 | DateTime::DateTime() |
50 | : d(new Private) |
51 | { |
52 | } |
53 | |
54 | DateTime::DateTime(const QDate& d, const KDateTime::Spec& spec) |
55 | : d(new Private(d, spec)) |
56 | { |
57 | } |
58 | |
59 | DateTime::DateTime(const QDate& d, const QTime& t, const KDateTime::Spec& spec) |
60 | : d(new Private(d, t, spec)) |
61 | { |
62 | } |
63 | |
64 | DateTime::DateTime(const QDateTime& dt, const KDateTime::Spec& spec) |
65 | : d(new Private(dt, spec)) |
66 | { |
67 | } |
68 | |
69 | DateTime::DateTime(const KDateTime& dt) |
70 | : d(new Private(dt)) |
71 | { |
72 | } |
73 | |
74 | DateTime::DateTime(const DateTime& dt) |
75 | : d(new Private(*dt.d)) |
76 | { |
77 | } |
78 | |
79 | DateTime::~DateTime() |
80 | { |
81 | delete d; |
82 | } |
83 | |
84 | DateTime& DateTime::operator=(const DateTime& dt) |
85 | { |
86 | if (&dt != this) |
87 | *d = *dt.d; |
88 | return *this; |
89 | } |
90 | |
91 | DateTime& DateTime::operator=(const KDateTime& dt) |
92 | { |
93 | d->mDateTime = dt; |
94 | return *this; |
95 | } |
96 | |
97 | bool DateTime::isNull() const |
98 | { |
99 | return d->mDateTime.isNull(); |
100 | } |
101 | |
102 | bool DateTime::isValid() const |
103 | { |
104 | return d->mDateTime.isValid(); |
105 | } |
106 | |
107 | bool DateTime::isDateOnly() const |
108 | { |
109 | return d->mDateTime.isDateOnly(); |
110 | } |
111 | |
112 | void DateTime::setDateOnly(bool dateOnly) |
113 | { |
114 | d->mDateTime.setDateOnly(dateOnly); |
115 | } |
116 | |
117 | QDate DateTime::date() const |
118 | { |
119 | return d->mDateTime.date(); |
120 | } |
121 | |
122 | void DateTime::setDate(const QDate& date) |
123 | { |
124 | d->mDateTime.setDate(date); |
125 | } |
126 | |
127 | QDateTime DateTime::rawDateTime() const |
128 | { |
129 | return d->mDateTime.dateTime(); |
130 | } |
131 | |
132 | KDateTime DateTime::kDateTime() const |
133 | { |
134 | return d->mDateTime; |
135 | } |
136 | |
137 | QTime DateTime::effectiveTime() const |
138 | { |
139 | return d->mDateTime.isDateOnly() ? d->mStartOfDay : d->mDateTime.time(); |
140 | } |
141 | |
142 | void DateTime::setTime(const QTime& t) |
143 | { |
144 | d->mDateTime.setTime(t); |
145 | } |
146 | |
147 | QDateTime DateTime::effectiveDateTime() const |
148 | { |
149 | if (d->mDateTime.isDateOnly()) |
150 | { |
151 | QDateTime dt = d->mDateTime.dateTime(); // preserve Qt::UTC or Qt::LocalTime |
152 | dt.setTime(d->mStartOfDay); |
153 | return dt; |
154 | } |
155 | return d->mDateTime.dateTime(); |
156 | } |
157 | |
158 | void DateTime::setDateTime(const QDateTime& dt) |
159 | { |
160 | d->mDateTime.setDateTime(dt); |
161 | } |
162 | |
163 | KDateTime DateTime::effectiveKDateTime() const |
164 | { |
165 | if (d->mDateTime.isDateOnly()) |
166 | { |
167 | KDateTime dt = d->mDateTime; |
168 | dt.setTime(d->mStartOfDay); |
169 | return dt; |
170 | } |
171 | return d->mDateTime; |
172 | } |
173 | |
174 | KDateTime DateTime::calendarKDateTime() const |
175 | { |
176 | if (d->mDateTime.isDateOnly()) |
177 | { |
178 | KDateTime dt = d->mDateTime; |
179 | dt.setTime(QTime(0, 0)); |
180 | return dt; |
181 | } |
182 | return d->mDateTime; |
183 | } |
184 | |
185 | KTimeZone DateTime::timeZone() const |
186 | { |
187 | return d->mDateTime.timeZone(); |
188 | } |
189 | |
190 | KDateTime::Spec DateTime::timeSpec() const |
191 | { |
192 | return d->mDateTime.timeSpec(); |
193 | } |
194 | |
195 | void DateTime::setTimeSpec(const KDateTime::Spec &spec) |
196 | { |
197 | d->mDateTime.setTimeSpec(spec); |
198 | } |
199 | |
200 | KDateTime::SpecType DateTime::timeType() const |
201 | { |
202 | return d->mDateTime.timeType(); |
203 | } |
204 | |
205 | bool DateTime::isLocalZone() const |
206 | { |
207 | return d->mDateTime.isLocalZone(); |
208 | } |
209 | |
210 | bool DateTime::isClockTime() const |
211 | { |
212 | return d->mDateTime.isClockTime(); |
213 | } |
214 | |
215 | bool DateTime::isUtc() const |
216 | { |
217 | return d->mDateTime.isUtc(); |
218 | } |
219 | |
220 | bool DateTime::isOffsetFromUtc() const |
221 | { |
222 | return d->mDateTime.isOffsetFromUtc(); |
223 | } |
224 | |
225 | int DateTime::utcOffset() const |
226 | { |
227 | return d->mDateTime.utcOffset(); |
228 | } |
229 | |
230 | bool DateTime::isSecondOccurrence() const |
231 | { |
232 | return d->mDateTime.isSecondOccurrence(); |
233 | } |
234 | |
235 | void DateTime::setSecondOccurrence(bool second) |
236 | { |
237 | d->mDateTime.setSecondOccurrence(second); |
238 | } |
239 | |
240 | DateTime DateTime::toUtc() const |
241 | { |
242 | return DateTime(d->mDateTime.toUtc()); |
243 | } |
244 | |
245 | DateTime DateTime::toOffsetFromUtc() const |
246 | { |
247 | return DateTime(d->mDateTime.toOffsetFromUtc()); |
248 | } |
249 | |
250 | DateTime DateTime::toOffsetFromUtc(int utcOffset) const |
251 | { |
252 | return DateTime(d->mDateTime.toOffsetFromUtc(utcOffset)); |
253 | } |
254 | |
255 | DateTime DateTime::toLocalZone() const |
256 | { |
257 | return DateTime(d->mDateTime.toLocalZone()); |
258 | } |
259 | |
260 | DateTime DateTime::toClockTime() const |
261 | { |
262 | return DateTime(d->mDateTime.toClockTime()); |
263 | } |
264 | |
265 | DateTime DateTime::toZone(const KTimeZone& zone) const |
266 | { |
267 | return DateTime(d->mDateTime.toZone(zone)); |
268 | } |
269 | |
270 | DateTime DateTime::toTimeSpec(const KDateTime::Spec &spec) const |
271 | { |
272 | return DateTime(d->mDateTime.toTimeSpec(spec)); |
273 | } |
274 | |
275 | uint DateTime::toTime_t() const |
276 | { |
277 | return d->mDateTime.toTime_t(); |
278 | } |
279 | |
280 | void DateTime::setTime_t(uint secs) |
281 | { |
282 | d->mDateTime.setTime_t(secs); |
283 | } |
284 | |
285 | DateTime DateTime::addSecs(qint64 n) const |
286 | { |
287 | return DateTime(d->mDateTime.addSecs(n)); |
288 | } |
289 | |
290 | DateTime DateTime::addMins(qint64 n) const |
291 | { |
292 | return DateTime(d->mDateTime.addSecs(n * 60)); |
293 | } |
294 | |
295 | DateTime DateTime::addDays(int n) const |
296 | { |
297 | return DateTime(d->mDateTime.addDays(n)); |
298 | } |
299 | |
300 | DateTime DateTime::addMonths(int n) const |
301 | { |
302 | return DateTime(d->mDateTime.addMonths(n)); |
303 | } |
304 | |
305 | DateTime DateTime::addYears(int n) const |
306 | { |
307 | return DateTime(d->mDateTime.addYears(n)); |
308 | } |
309 | |
310 | int DateTime::daysTo(const DateTime& dt) const |
311 | { |
312 | return d->mDateTime.daysTo(dt.d->mDateTime); |
313 | } |
314 | |
315 | int DateTime::minsTo(const DateTime& dt) const |
316 | { |
317 | return d->mDateTime.secsTo(dt.d->mDateTime) / 60; |
318 | } |
319 | |
320 | int DateTime::secsTo(const DateTime& dt) const |
321 | { |
322 | return d->mDateTime.secsTo(dt.d->mDateTime); |
323 | } |
324 | |
325 | qint64 DateTime::secsTo_long(const DateTime& dt) const |
326 | { |
327 | return d->mDateTime.secsTo_long(dt.d->mDateTime); |
328 | } |
329 | |
330 | QString DateTime::toString(Qt::DateFormat f) const |
331 | { |
332 | if (d->mDateTime.isDateOnly()) |
333 | return d->mDateTime.date().toString(f); |
334 | else |
335 | return d->mDateTime.dateTime().toString(f); |
336 | } |
337 | |
338 | QString DateTime::toString(const QString& format) const |
339 | { |
340 | if (d->mDateTime.isDateOnly()) |
341 | return d->mDateTime.date().toString(format); |
342 | else |
343 | return d->mDateTime.dateTime().toString(format); |
344 | } |
345 | |
346 | QString DateTime::formatLocale(bool shortFormat) const |
347 | { |
348 | return KGlobal::locale()->formatDateTime(d->mDateTime, (shortFormat ? KLocale::ShortDate : KLocale::LongDate)); |
349 | } |
350 | |
351 | void DateTime::setStartOfDay(const QTime& sod) |
352 | { |
353 | Private::mStartOfDay = sod; |
354 | } |
355 | |
356 | KDateTime::Comparison DateTime::compare(const DateTime &other) const |
357 | { |
358 | return d->mDateTime.compare(other.d->mDateTime); |
359 | } |
360 | |
361 | QTime DateTime::startOfDay() |
362 | { |
363 | return Private::mStartOfDay; |
364 | } |
365 | |
366 | bool operator==(const DateTime& dt1, const DateTime& dt2) |
367 | { |
368 | return dt1.d->mDateTime == dt2.d->mDateTime; |
369 | } |
370 | |
371 | bool operator==(const KDateTime& dt1, const DateTime& dt2) |
372 | { |
373 | return dt1 == dt2.d->mDateTime; |
374 | } |
375 | |
376 | bool operator<(const DateTime& dt1, const DateTime& dt2) |
377 | { |
378 | if (dt1.d->mDateTime.isDateOnly() && !dt2.d->mDateTime.isDateOnly()) |
379 | { |
380 | KDateTime dt = dt1.d->mDateTime.addDays(1); |
381 | dt.setTime(DateTime::Private::mStartOfDay); |
382 | return dt <= dt2.d->mDateTime; |
383 | } |
384 | if (!dt1.d->mDateTime.isDateOnly() && dt2.d->mDateTime.isDateOnly()) |
385 | { |
386 | KDateTime dt = dt2.d->mDateTime; |
387 | dt.setTime(DateTime::Private::mStartOfDay); |
388 | return dt1.d->mDateTime < dt; |
389 | } |
390 | return dt1.d->mDateTime < dt2.d->mDateTime; |
391 | } |
392 | |
393 | } // namespace KAlarmCal |
394 | |
395 | // vim: et sw=4: |
396 | |