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
31namespace KAlarmCal
32{
33
34class 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
47QTime DateTime::Private::mStartOfDay;
48
49DateTime::DateTime()
50 : d(new Private)
51{
52}
53
54DateTime::DateTime(const QDate& d, const KDateTime::Spec& spec)
55 : d(new Private(d, spec))
56{
57}
58
59DateTime::DateTime(const QDate& d, const QTime& t, const KDateTime::Spec& spec)
60 : d(new Private(d, t, spec))
61{
62}
63
64DateTime::DateTime(const QDateTime& dt, const KDateTime::Spec& spec)
65 : d(new Private(dt, spec))
66{
67}
68
69DateTime::DateTime(const KDateTime& dt)
70 : d(new Private(dt))
71{
72}
73
74DateTime::DateTime(const DateTime& dt)
75 : d(new Private(*dt.d))
76{
77}
78
79DateTime::~DateTime()
80{
81 delete d;
82}
83
84DateTime& DateTime::operator=(const DateTime& dt)
85{
86 if (&dt != this)
87 *d = *dt.d;
88 return *this;
89}
90
91DateTime& DateTime::operator=(const KDateTime& dt)
92{
93 d->mDateTime = dt;
94 return *this;
95}
96
97bool DateTime::isNull() const
98{
99 return d->mDateTime.isNull();
100}
101
102bool DateTime::isValid() const
103{
104 return d->mDateTime.isValid();
105}
106
107bool DateTime::isDateOnly() const
108{
109 return d->mDateTime.isDateOnly();
110}
111
112void DateTime::setDateOnly(bool dateOnly)
113{
114 d->mDateTime.setDateOnly(dateOnly);
115}
116
117QDate DateTime::date() const
118{
119 return d->mDateTime.date();
120}
121
122void DateTime::setDate(const QDate& date)
123{
124 d->mDateTime.setDate(date);
125}
126
127QDateTime DateTime::rawDateTime() const
128{
129 return d->mDateTime.dateTime();
130}
131
132KDateTime DateTime::kDateTime() const
133{
134 return d->mDateTime;
135}
136
137QTime DateTime::effectiveTime() const
138{
139 return d->mDateTime.isDateOnly() ? d->mStartOfDay : d->mDateTime.time();
140}
141
142void DateTime::setTime(const QTime& t)
143{
144 d->mDateTime.setTime(t);
145}
146
147QDateTime 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
158void DateTime::setDateTime(const QDateTime& dt)
159{
160 d->mDateTime.setDateTime(dt);
161}
162
163KDateTime 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
174KDateTime 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
185KTimeZone DateTime::timeZone() const
186{
187 return d->mDateTime.timeZone();
188}
189
190KDateTime::Spec DateTime::timeSpec() const
191{
192 return d->mDateTime.timeSpec();
193}
194
195void DateTime::setTimeSpec(const KDateTime::Spec &spec)
196{
197 d->mDateTime.setTimeSpec(spec);
198}
199
200KDateTime::SpecType DateTime::timeType() const
201{
202 return d->mDateTime.timeType();
203}
204
205bool DateTime::isLocalZone() const
206{
207 return d->mDateTime.isLocalZone();
208}
209
210bool DateTime::isClockTime() const
211{
212 return d->mDateTime.isClockTime();
213}
214
215bool DateTime::isUtc() const
216{
217 return d->mDateTime.isUtc();
218}
219
220bool DateTime::isOffsetFromUtc() const
221{
222 return d->mDateTime.isOffsetFromUtc();
223}
224
225int DateTime::utcOffset() const
226{
227 return d->mDateTime.utcOffset();
228}
229
230bool DateTime::isSecondOccurrence() const
231{
232 return d->mDateTime.isSecondOccurrence();
233}
234
235void DateTime::setSecondOccurrence(bool second)
236{
237 d->mDateTime.setSecondOccurrence(second);
238}
239
240DateTime DateTime::toUtc() const
241{
242 return DateTime(d->mDateTime.toUtc());
243}
244
245DateTime DateTime::toOffsetFromUtc() const
246{
247 return DateTime(d->mDateTime.toOffsetFromUtc());
248}
249
250DateTime DateTime::toOffsetFromUtc(int utcOffset) const
251{
252 return DateTime(d->mDateTime.toOffsetFromUtc(utcOffset));
253}
254
255DateTime DateTime::toLocalZone() const
256{
257 return DateTime(d->mDateTime.toLocalZone());
258}
259
260DateTime DateTime::toClockTime() const
261{
262 return DateTime(d->mDateTime.toClockTime());
263}
264
265DateTime DateTime::toZone(const KTimeZone& zone) const
266{
267 return DateTime(d->mDateTime.toZone(zone));
268}
269
270DateTime DateTime::toTimeSpec(const KDateTime::Spec &spec) const
271{
272 return DateTime(d->mDateTime.toTimeSpec(spec));
273}
274
275uint DateTime::toTime_t() const
276{
277 return d->mDateTime.toTime_t();
278}
279
280void DateTime::setTime_t(uint secs)
281{
282 d->mDateTime.setTime_t(secs);
283}
284
285DateTime DateTime::addSecs(qint64 n) const
286{
287 return DateTime(d->mDateTime.addSecs(n));
288}
289
290DateTime DateTime::addMins(qint64 n) const
291{
292 return DateTime(d->mDateTime.addSecs(n * 60));
293}
294
295DateTime DateTime::addDays(int n) const
296{
297 return DateTime(d->mDateTime.addDays(n));
298}
299
300DateTime DateTime::addMonths(int n) const
301{
302 return DateTime(d->mDateTime.addMonths(n));
303}
304
305DateTime DateTime::addYears(int n) const
306{
307 return DateTime(d->mDateTime.addYears(n));
308}
309
310int DateTime::daysTo(const DateTime& dt) const
311{
312 return d->mDateTime.daysTo(dt.d->mDateTime);
313}
314
315int DateTime::minsTo(const DateTime& dt) const
316{
317 return d->mDateTime.secsTo(dt.d->mDateTime) / 60;
318}
319
320int DateTime::secsTo(const DateTime& dt) const
321{
322 return d->mDateTime.secsTo(dt.d->mDateTime);
323}
324
325qint64 DateTime::secsTo_long(const DateTime& dt) const
326{
327 return d->mDateTime.secsTo_long(dt.d->mDateTime);
328}
329
330QString 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
338QString 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
346QString DateTime::formatLocale(bool shortFormat) const
347{
348 return KGlobal::locale()->formatDateTime(d->mDateTime, (shortFormat ? KLocale::ShortDate : KLocale::LongDate));
349}
350
351void DateTime::setStartOfDay(const QTime& sod)
352{
353 Private::mStartOfDay = sod;
354}
355
356KDateTime::Comparison DateTime::compare(const DateTime &other) const
357{
358 return d->mDateTime.compare(other.d->mDateTime);
359}
360
361QTime DateTime::startOfDay()
362{
363 return Private::mStartOfDay;
364}
365
366bool operator==(const DateTime& dt1, const DateTime& dt2)
367{
368 return dt1.d->mDateTime == dt2.d->mDateTime;
369}
370
371bool operator==(const KDateTime& dt1, const DateTime& dt2)
372{
373 return dt1 == dt2.d->mDateTime;
374}
375
376bool 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