• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdelibs API Reference
  • KDE Home
  • Contact Us
 

KDECore

  • sources
  • kde-4.14
  • kdelibs
  • kdecore
  • date
kcalendarsystemislamiccivil.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2002-2003 Carlos Moro <cfmoro@correo.uniovi.es>
3  Copyright (c) 2002-2003 Hans Petter Bieker <bieker@kde.org>
4  Copyright 2007, 2008, 2009, 2010 John Layt <john@layt.net>
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Library General Public
8  License as published by the Free Software Foundation; either
9  version 2 of the License, or (at your option) any later version.
10 
11  This library is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  Library General Public License for more details.
15 
16  You should have received a copy of the GNU Library General Public License
17  along with this library; see the file COPYING.LIB. If not, write to
18  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  Boston, MA 02110-1301, USA.
20 */
21 
22 #include "kcalendarsystemislamiccivil_p.h"
23 #include "kcalendarsystemprivate_p.h"
24 
25 #include <QtCore/QDate>
26 
27 class KCalendarSystemIslamicCivilPrivate : public KCalendarSystemPrivate
28 {
29 public:
30  explicit KCalendarSystemIslamicCivilPrivate(KCalendarSystemIslamicCivil *q);
31 
32  virtual ~KCalendarSystemIslamicCivilPrivate();
33 
34  // Virtual methods each calendar system must re-implement
35  virtual KLocale::CalendarSystem calendarSystem() const;
36  virtual void loadDefaultEraList();
37  virtual int monthsInYear(int year) const;
38  virtual int daysInMonth(int year, int month) const;
39  virtual int daysInYear(int year) const;
40  virtual int daysInWeek() const;
41  virtual bool isLeapYear(int year) const;
42  virtual bool hasLeapMonths() const;
43  virtual bool hasYearZero() const;
44  virtual int maxDaysInWeek() const;
45  virtual int maxMonthsInYear() const;
46  virtual int earliestValidYear() const;
47  virtual int latestValidYear() const;
48  virtual QString monthName(int month, int year, KLocale::DateTimeComponentFormat format, bool possessive) const;
49  virtual QString weekDayName(int weekDay, KLocale::DateTimeComponentFormat format) const;
50 };
51 
52 // Shared d pointer base class definitions
53 
54 KCalendarSystemIslamicCivilPrivate::KCalendarSystemIslamicCivilPrivate(KCalendarSystemIslamicCivil *q)
55  : KCalendarSystemPrivate(q)
56 {
57 }
58 
59 KCalendarSystemIslamicCivilPrivate::~KCalendarSystemIslamicCivilPrivate()
60 {
61 }
62 
63 KLocale::CalendarSystem KCalendarSystemIslamicCivilPrivate::calendarSystem() const
64 {
65  return KLocale::IslamicCivilCalendar;
66 }
67 
68 void KCalendarSystemIslamicCivilPrivate::loadDefaultEraList()
69 {
70  QString name, shortName, format;
71  // Islamic Era, Anno Hegirae, "Year of the Hijra".
72  name = i18nc("Calendar Era: Hijri Islamic Era, years > 0, LongFormat", "Anno Hegirae");
73  shortName = i18nc("Calendar Era: Hijri Islamic Era, years > 0, ShortFormat", "AH");
74  format = i18nc("(kdedt-format) Hijri, AH, full era year format used for %EY, e.g. 2000 AH", "%Ey %EC");
75  addEra('+', 1, q->epoch(), 1, q->latestValidDate(), name, shortName, format);
76 }
77 
78 int KCalendarSystemIslamicCivilPrivate::monthsInYear(int year) const
79 {
80  Q_UNUSED(year)
81  return 12;
82 }
83 
84 int KCalendarSystemIslamicCivilPrivate::daysInMonth(int year, int month) const
85 {
86  if (month == 12 && isLeapYear(year)) {
87  return 30;
88  }
89 
90  if (month % 2 == 0) { // Even number months have 29 days
91  return 29;
92  } else { // Odd number months have 30 days
93  return 30;
94  }
95 }
96 
97 int KCalendarSystemIslamicCivilPrivate::daysInYear(int year) const
98 {
99  if (isLeapYear(year)) {
100  return 355;
101  } else {
102  return 354;
103  }
104 }
105 
106 int KCalendarSystemIslamicCivilPrivate::daysInWeek() const
107 {
108  return 7;
109 }
110 
111 bool KCalendarSystemIslamicCivilPrivate::isLeapYear(int year) const
112 {
113  // Years 2, 5, 7, 10, 13, 16, 18, 21, 24, 26, 29 of the 30 year cycle
114 
115  /*
116  The following C++ code is translated from the Lisp code
117  in ``Calendrical Calculations'' by Nachum Dershowitz and
118  Edward M. Reingold, Software---Practice & Experience,
119  vol. 20, no. 9 (September, 1990), pp. 899--928.
120 
121  This code is in the public domain, but any use of it
122  should publically acknowledge its source.
123  */
124 
125  if ((((11 * year) + 14) % 30) < 11) {
126  return true;
127  } else {
128  return false;
129  }
130 
131  // The following variations will be implemented in separate classes in 4.5
132  // May be cleaner to formally define using a case statement switch on (year % 30)
133 
134  // Variation used by Bar Habraeus / Graves / Birashk / Some Microsoft products
135  // Years 2, 5, 7, 10, 13, 15, 18, 21, 24, 26, 29 of the 30 year cycle
136  // if ( ( ( ( 11 * year ) + 15 ) % 30 ) < 11 ) {
137 
138  // Variation used by Bohras / Sahifa with epoch 15 July 622 jd = 1948440
139  // Years 2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29 of the 30 year cycle
140  // if ( ( ( ( 11 * year ) + 1 ) % 30 ) < 11 ) {
141 }
142 
143 bool KCalendarSystemIslamicCivilPrivate::hasLeapMonths() const
144 {
145  return false;
146 }
147 
148 bool KCalendarSystemIslamicCivilPrivate::hasYearZero() const
149 {
150  return false;
151 }
152 
153 int KCalendarSystemIslamicCivilPrivate::maxDaysInWeek() const
154 {
155  return 7;
156 }
157 
158 int KCalendarSystemIslamicCivilPrivate::maxMonthsInYear() const
159 {
160  return 12;
161 }
162 
163 int KCalendarSystemIslamicCivilPrivate::earliestValidYear() const
164 {
165  return 1;
166 }
167 
168 int KCalendarSystemIslamicCivilPrivate::latestValidYear() const
169 {
170  return 9999;
171 }
172 
173 QString KCalendarSystemIslamicCivilPrivate::monthName(int month, int year, KLocale::DateTimeComponentFormat format, bool possessive) const
174 {
175  Q_UNUSED(year);
176 
177  if (format == KLocale::NarrowName) {
178  switch (month) {
179  case 1:
180  return ki18nc("Hijri month 1 - KLocale::NarrowName", "M").toString(locale());
181  case 2:
182  return ki18nc("Hijri month 2 - KLocale::NarrowName", "S").toString(locale());
183  case 3:
184  return ki18nc("Hijri month 3 - KLocale::NarrowName", "A").toString(locale());
185  case 4:
186  return ki18nc("Hijri month 4 - KLocale::NarrowName", "T").toString(locale());
187  case 5:
188  return ki18nc("Hijri month 5 - KLocale::NarrowName", "A").toString(locale());
189  case 6:
190  return ki18nc("Hijri month 6 - KLocale::NarrowName", "T").toString(locale());
191  case 7:
192  return ki18nc("Hijri month 7 - KLocale::NarrowName", "R").toString(locale());
193  case 8:
194  return ki18nc("Hijri month 8 - KLocale::NarrowName", "S").toString(locale());
195  case 9:
196  return ki18nc("Hijri month 9 - KLocale::NarrowName", "R").toString(locale());
197  case 10:
198  return ki18nc("Hijri month 10 - KLocale::NarrowName", "S").toString(locale());
199  case 11:
200  return ki18nc("Hijri month 11 - KLocale::NarrowName", "Q").toString(locale());
201  case 12:
202  return ki18nc("Hijri month 12 - KLocale::NarrowName", "H").toString(locale());
203  default:
204  return QString();
205  }
206  }
207 
208  if (format == KLocale::ShortName && possessive) {
209  switch (month) {
210  case 1:
211  return ki18nc("Hijri month 1 - KLocale::ShortName Possessive", "of Muh").toString(locale());
212  case 2:
213  return ki18nc("Hijri month 2 - KLocale::ShortName Possessive", "of Saf").toString(locale());
214  case 3:
215  return ki18nc("Hijri month 3 - KLocale::ShortName Possessive", "of R.A").toString(locale());
216  case 4:
217  return ki18nc("Hijri month 4 - KLocale::ShortName Possessive", "of R.T").toString(locale());
218  case 5:
219  return ki18nc("Hijri month 5 - KLocale::ShortName Possessive", "of J.A").toString(locale());
220  case 6:
221  return ki18nc("Hijri month 6 - KLocale::ShortName Possessive", "of J.T").toString(locale());
222  case 7:
223  return ki18nc("Hijri month 7 - KLocale::ShortName Possessive", "of Raj").toString(locale());
224  case 8:
225  return ki18nc("Hijri month 8 - KLocale::ShortName Possessive", "of Sha").toString(locale());
226  case 9:
227  return ki18nc("Hijri month 9 - KLocale::ShortName Possessive", "of Ram").toString(locale());
228  case 10:
229  return ki18nc("Hijri month 10 - KLocale::ShortName Possessive", "of Shw").toString(locale());
230  case 11:
231  return ki18nc("Hijri month 11 - KLocale::ShortName Possessive", "of Qid").toString(locale());
232  case 12:
233  return ki18nc("Hijri month 12 - KLocale::ShortName Possessive", "of Hij").toString(locale());
234  default:
235  return QString();
236  }
237  }
238 
239  if (format == KLocale::ShortName && !possessive) {
240  switch (month) {
241  case 1:
242  return ki18nc("Hijri month 1 - KLocale::ShortName", "Muh").toString(locale());
243  case 2:
244  return ki18nc("Hijri month 2 - KLocale::ShortName", "Saf").toString(locale());
245  case 3:
246  return ki18nc("Hijri month 3 - KLocale::ShortName", "R.A").toString(locale());
247  case 4:
248  return ki18nc("Hijri month 4 - KLocale::ShortName", "R.T").toString(locale());
249  case 5:
250  return ki18nc("Hijri month 5 - KLocale::ShortName", "J.A").toString(locale());
251  case 6:
252  return ki18nc("Hijri month 6 - KLocale::ShortName", "J.T").toString(locale());
253  case 7:
254  return ki18nc("Hijri month 7 - KLocale::ShortName", "Raj").toString(locale());
255  case 8:
256  return ki18nc("Hijri month 8 - KLocale::ShortName", "Sha").toString(locale());
257  case 9:
258  return ki18nc("Hijri month 9 - KLocale::ShortName", "Ram").toString(locale());
259  case 10:
260  return ki18nc("Hijri month 10 - KLocale::ShortName", "Shw").toString(locale());
261  case 11:
262  return ki18nc("Hijri month 11 - KLocale::ShortName", "Qid").toString(locale());
263  case 12:
264  return ki18nc("Hijri month 12 - KLocale::ShortName", "Hij").toString(locale());
265  default:
266  return QString();
267  }
268  }
269 
270  if (format == KLocale::LongName && possessive) {
271  switch (month) {
272  case 1:
273  return ki18nc("Hijri month 1 - KLocale::LongName Possessive", "of Muharram").toString(locale());
274  case 2:
275  return ki18nc("Hijri month 2 - KLocale::LongName Possessive", "of Safar").toString(locale());
276  case 3:
277  return ki18nc("Hijri month 3 - KLocale::LongName Possessive", "of Rabi` al-Awal").toString(locale());
278  case 4:
279  return ki18nc("Hijri month 4 - KLocale::LongName Possessive", "of Rabi` al-Thaani").toString(locale());
280  case 5:
281  return ki18nc("Hijri month 5 - KLocale::LongName Possessive", "of Jumaada al-Awal").toString(locale());
282  case 6:
283  return ki18nc("Hijri month 6 - KLocale::LongName Possessive", "of Jumaada al-Thaani").toString(locale());
284  case 7:
285  return ki18nc("Hijri month 7 - KLocale::LongName Possessive", "of Rajab").toString(locale());
286  case 8:
287  return ki18nc("Hijri month 8 - KLocale::LongName Possessive", "of Sha`ban").toString(locale());
288  case 9:
289  return ki18nc("Hijri month 9 - KLocale::LongName Possessive", "of Ramadan").toString(locale());
290  case 10:
291  return ki18nc("Hijri month 10 - KLocale::LongName Possessive", "of Shawwal").toString(locale());
292  case 11:
293  return ki18nc("Hijri month 11 - KLocale::LongName Possessive", "of Thu al-Qi`dah").toString(locale());
294  case 12:
295  return ki18nc("Hijri month 12 - KLocale::LongName Possessive", "of Thu al-Hijjah").toString(locale());
296  default:
297  return QString();
298  }
299  }
300 
301  // Default to LongName
302  switch (month) {
303  case 1:
304  return ki18nc("Hijri month 1 - KLocale::LongName", "Muharram").toString(locale());
305  case 2:
306  return ki18nc("Hijri month 2 - KLocale::LongName", "Safar").toString(locale());
307  case 3:
308  return ki18nc("Hijri month 3 - KLocale::LongName", "Rabi` al-Awal").toString(locale());
309  case 4:
310  return ki18nc("Hijri month 4 - KLocale::LongName", "Rabi` al-Thaani").toString(locale());
311  case 5:
312  return ki18nc("Hijri month 5 - KLocale::LongName", "Jumaada al-Awal").toString(locale());
313  case 6:
314  return ki18nc("Hijri month 6 - KLocale::LongName", "Jumaada al-Thaani").toString(locale());
315  case 7:
316  return ki18nc("Hijri month 7 - KLocale::LongName", "Rajab").toString(locale());
317  case 8:
318  return ki18nc("Hijri month 8 - KLocale::LongName", "Sha`ban").toString(locale());
319  case 9:
320  return ki18nc("Hijri month 9 - KLocale::LongName", "Ramadan").toString(locale());
321  case 10:
322  return ki18nc("Hijri month 10 - KLocale::LongName", "Shawwal").toString(locale());
323  case 11:
324  return ki18nc("Hijri month 11 - KLocale::LongName", "Thu al-Qi`dah").toString(locale());
325  case 12:
326  return ki18nc("Hijri month 12 - KLocale::LongName", "Thu al-Hijjah").toString(locale());
327  default:
328  return QString();
329  }
330 }
331 
332 QString KCalendarSystemIslamicCivilPrivate::weekDayName(int weekDay, KLocale::DateTimeComponentFormat format) const
333 {
334  if (format == KLocale::NarrowName) {
335  switch (weekDay) {
336  case 1:
337  return ki18nc("Hijri weekday 1 - KLocale::NarrowName ", "I").toString(locale());
338  case 2:
339  return ki18nc("Hijri weekday 2 - KLocale::NarrowName ", "T").toString(locale());
340  case 3:
341  return ki18nc("Hijri weekday 3 - KLocale::NarrowName ", "A").toString(locale());
342  case 4:
343  return ki18nc("Hijri weekday 4 - KLocale::NarrowName ", "K").toString(locale());
344  case 5:
345  return ki18nc("Hijri weekday 5 - KLocale::NarrowName ", "J").toString(locale());
346  case 6:
347  return ki18nc("Hijri weekday 6 - KLocale::NarrowName ", "S").toString(locale());
348  case 7:
349  return ki18nc("Hijri weekday 7 - KLocale::NarrowName ", "A").toString(locale());
350  default:
351  return QString();
352  }
353  }
354 
355  if (format == KLocale::ShortName || format == KLocale:: ShortNumber) {
356  switch (weekDay) {
357  case 1:
358  return ki18nc("Hijri weekday 1 - KLocale::ShortName", "Ith").toString(locale());
359  case 2:
360  return ki18nc("Hijri weekday 2 - KLocale::ShortName", "Thl").toString(locale());
361  case 3:
362  return ki18nc("Hijri weekday 3 - KLocale::ShortName", "Arb").toString(locale());
363  case 4:
364  return ki18nc("Hijri weekday 4 - KLocale::ShortName", "Kha").toString(locale());
365  case 5:
366  return ki18nc("Hijri weekday 5 - KLocale::ShortName", "Jum").toString(locale());
367  case 6:
368  return ki18nc("Hijri weekday 6 - KLocale::ShortName", "Sab").toString(locale());
369  case 7:
370  return ki18nc("Hijri weekday 7 - KLocale::ShortName", "Ahd").toString(locale());
371  default: return QString();
372  }
373  }
374 
375  switch (weekDay) {
376  case 1:
377  return ki18nc("Hijri weekday 1 - KLocale::LongName", "Yaum al-Ithnain").toString(locale());
378  case 2:
379  return ki18nc("Hijri weekday 2 - KLocale::LongName", "Yau al-Thulatha").toString(locale());
380  case 3:
381  return ki18nc("Hijri weekday 3 - KLocale::LongName", "Yaum al-Arbi'a").toString(locale());
382  case 4:
383  return ki18nc("Hijri weekday 4 - KLocale::LongName", "Yaum al-Khamees").toString(locale());
384  case 5:
385  return ki18nc("Hijri weekday 5 - KLocale::LongName", "Yaum al-Jumma").toString(locale());
386  case 6:
387  return ki18nc("Hijri weekday 6 - KLocale::LongName", "Yaum al-Sabt").toString(locale());
388  case 7:
389  return ki18nc("Hijri weekday 7 - KLocale::LongName", "Yaum al-Ahad").toString(locale());
390  default:
391  return QString();
392  }
393 }
394 
395 
396 KCalendarSystemIslamicCivil::KCalendarSystemIslamicCivil(const KLocale *locale)
397  : KCalendarSystem(*new KCalendarSystemIslamicCivilPrivate(this), KSharedConfig::Ptr(), locale)
398 {
399  d_ptr->loadConfig(calendarType());
400 }
401 
402 KCalendarSystemIslamicCivil::KCalendarSystemIslamicCivil(const KSharedConfig::Ptr config, const KLocale *locale)
403  : KCalendarSystem(*new KCalendarSystemIslamicCivilPrivate(this), config, locale)
404 {
405  d_ptr->loadConfig(calendarType());
406 }
407 
408 KCalendarSystemIslamicCivil::KCalendarSystemIslamicCivil(KCalendarSystemIslamicCivilPrivate &dd,
409  const KSharedConfig::Ptr config, const KLocale *locale)
410  : KCalendarSystem(dd, config, locale)
411 {
412  d_ptr->loadConfig(calendarType());
413 }
414 
415 KCalendarSystemIslamicCivil::~KCalendarSystemIslamicCivil()
416 {
417 }
418 
419 QString KCalendarSystemIslamicCivil::calendarType() const
420 {
421  return QLatin1String("hijri");
422 }
423 
424 QDate KCalendarSystemIslamicCivil::epoch() const
425 {
426  // 16 July 622 in the Julian calendar
427  return QDate::fromJulianDay(1948440);
428 }
429 
430 QDate KCalendarSystemIslamicCivil::earliestValidDate() const
431 {
432  return epoch();
433 }
434 
435 QDate KCalendarSystemIslamicCivil::latestValidDate() const
436 {
437  // Set to last day of year 9999
438  // Last day of Islamic Civil year 9999 is 9999-12-29
439  return QDate::fromJulianDay(5491751);
440 }
441 
442 bool KCalendarSystemIslamicCivil::isValid(int year, int month, int day) const
443 {
444  return KCalendarSystem::isValid(year, month, day);
445 }
446 
447 bool KCalendarSystemIslamicCivil::isValid(const QDate &date) const
448 {
449  return KCalendarSystem::isValid(date);
450 }
451 
452 bool KCalendarSystemIslamicCivil::isLeapYear(int year) const
453 {
454  return KCalendarSystem::isLeapYear(year);
455 }
456 
457 bool KCalendarSystemIslamicCivil::isLeapYear(const QDate &date) const
458 {
459  return KCalendarSystem::isLeapYear(date);
460 }
461 
462 QString KCalendarSystemIslamicCivil::monthName(int month, int year, MonthNameFormat format) const
463 {
464  return KCalendarSystem::monthName(month, year, format);
465 }
466 
467 QString KCalendarSystemIslamicCivil::monthName(const QDate &date, MonthNameFormat format) const
468 {
469  return KCalendarSystem::monthName(date, format);
470 }
471 
472 QString KCalendarSystemIslamicCivil::weekDayName(int weekDay, WeekDayNameFormat format) const
473 {
474  return KCalendarSystem::weekDayName(weekDay, format);
475 }
476 
477 QString KCalendarSystemIslamicCivil::weekDayName(const QDate &date, WeekDayNameFormat format) const
478 {
479  return KCalendarSystem::weekDayName(date, format);
480 }
481 
482 int KCalendarSystemIslamicCivil::weekDayOfPray() const
483 {
484  return 5; // Friday
485 }
486 
487 bool KCalendarSystemIslamicCivil::isLunar() const
488 {
489  return true;
490 }
491 
492 bool KCalendarSystemIslamicCivil::isLunisolar() const
493 {
494  return false;
495 }
496 
497 bool KCalendarSystemIslamicCivil::isSolar() const
498 {
499  return false;
500 }
501 
502 bool KCalendarSystemIslamicCivil::isProleptic() const
503 {
504  return false;
505 }
506 
507 bool KCalendarSystemIslamicCivil::julianDayToDate(int jd, int &year, int &month, int &day) const
508 {
509  Q_D(const KCalendarSystemIslamicCivil);
510 
511  /*
512  The following C++ code is translated from the Lisp code
513  in ``Calendrical Calculations'' by Nachum Dershowitz and
514  Edward M. Reingold, Software---Practice & Experience,
515  vol. 20, no. 9 (September, 1990), pp. 899--928.
516 
517  This code is in the public domain, but any use of it
518  should publically acknowledge its source.
519  */
520 
521  // Search forward year by year from approximate year
522  year = (jd - epoch().toJulianDay()) / 355;
523  int testJd;
524  dateToJulianDay(year, 12, d->daysInMonth(year, 12), testJd);
525  while (jd > testJd) {
526  year++;
527  dateToJulianDay(year, 12, d->daysInMonth(year, 12), testJd);
528  }
529 
530  // Search forward month by month from Muharram
531  month = 1;
532  dateToJulianDay(year, month, d->daysInMonth(year, month), testJd);
533  while (jd > testJd) {
534  month++;
535  dateToJulianDay(year, month, d->daysInMonth(year, month), testJd);
536  }
537 
538  dateToJulianDay(year, month, 1, testJd);
539  day = jd - testJd + 1;
540 
541  return true;
542 
543  // Alternative implementations
544 
545  // More recent editions of "Calendrical Calculations" by Dershowitz & Reingold have a more
546  // efficient direct calculation without recusrion, but this cannot be used due to licensing
547 
548  /*
549  Formula from "Explanatory Supplement to the Astronomical Almanac" 2006, derived from Fliegel & Van Flandern 1968
550  int L = jd - epoch().toJulianDay() + 10632;
551  int N = ( L - 1 ) / 10631;
552  L = L - 10631 * N + 354;
553  int J = ( ( 10985 - L ) / 5316 ) x ( ( 50* L ) / 17719 ) + ( L / 5670 ) * ( ( 43 * L ) / 15238 );
554  L = L - ( ( 30 - J ) / 15 ) * ( ( 17719 * J ) / 50 ) - ( J / 16 ) * ( ( 15238 * J ) / 43 ) + 29;
555  year = ( 30 * N ) + J - 30;
556  month = ( 24 * L ) / 709;
557  day = L - ( ( 709 * month ) / 24 );
558  */
559 
560  /*
561  Formula from Fourmilab website
562  jd = Math.floor(jd) + 0.5;
563  year = Math.floor(((30 * (jd - epoch().toJulianDay())) + 10646) / 10631);
564  month = qMin(12, Math.ceil((jd - (29 + islamic_to_jd(year, 1, 1))) / 29.5) + 1);
565  day = (jd - islamic_to_jd(year, month, 1)) + 1;
566  */
567 }
568 
569 bool KCalendarSystemIslamicCivil::dateToJulianDay(int year, int month, int day, int &jd) const
570 {
571  /*
572  The following C++ code is translated from the Lisp code
573  in ``Calendrical Calculations'' by Nachum Dershowitz and
574  Edward M. Reingold, Software---Practice & Experience,
575  vol. 20, no. 9 (September, 1990), pp. 899--928.
576 
577  This code is in the public domain, but any use of it
578  should publically acknowledge its source.
579  */
580 
581  jd = epoch().toJulianDay() - 1 + // days before start of calendar
582  (year - 1) * 354 + // non-leap days in prior years
583  (3 + (11 * year)) / 30 + // leap days in prior years
584  29 * (month - 1) + // days so far...
585  month / 2 + // ...this year
586  day; // days so far this month
587 
588  return true;
589 
590  // Alternative implementations
591 
592  /*
593  Formula from "Explanatory Supplement to the Astronomical Almanac" 2006, derived from Fliegel & Van Flandern 1968
594  jd = ( 3 + ( 11 * year ) ) / 30 + 354 * year + 30 * month - ( month - 1 ) / 2 + day + epoch().toJulianDay() - 385;
595  */
596 }
KLocale::NarrowName
Narrow text format, may not be unique, e.g.
Definition: klocale.h:913
KSharedPtr< KSharedConfig >
KCalendarSystemIslamicCivil::calendarType
virtual QString calendarType() const
Definition: kcalendarsystemislamiccivil.cpp:419
KSharedConfig
KConfig variant using shared memory.
Definition: ksharedconfig.h:40
KLocalizedString::toString
QString toString() const
Finalizes the translation, creates QString with placeholders substituted.
Definition: klocalizedstring.cpp:192
KCalendarSystem::isLeapYear
virtual bool isLeapYear(int year) const =0
Returns whether a given year is a leap year.
Definition: kcalendarsystem.cpp:1720
KCalendarSystemPrivate::earliestValidYear
virtual int earliestValidYear() const
Definition: kcalendarsystem.cpp:371
KCalendarSystem::monthName
virtual QString monthName(int month, int year, MonthNameFormat format=LongName) const =0
Gets specific calendar type month name for a given month number If an invalid month is specified...
Definition: kcalendarsystem.cpp:1842
KCalendarSystemPrivate::loadDefaultEraList
virtual void loadDefaultEraList()
Definition: kcalendarsystem.cpp:269
KCalendarSystemIslamicCivil::weekDayOfPray
virtual int weekDayOfPray() const
Definition: kcalendarsystemislamiccivil.cpp:482
KCalendarSystemPrivate::monthsInYear
virtual int monthsInYear(int year) const
Definition: kcalendarsystem.cpp:277
KCalendarSystemIslamicCivil::latestValidDate
virtual QDate latestValidDate() const
Returns the latest date valid in this calendar system implementation.
Definition: kcalendarsystemislamiccivil.cpp:435
KCalendarSystem::day
virtual int day(const QDate &date) const
Returns the day portion of a given date in the current calendar system.
Definition: kcalendarsystem.cpp:1357
KCalendarSystemIslamicCivil::monthName
virtual QString monthName(int month, int year, MonthNameFormat format=LongName) const
Gets specific calendar type month name for a given month number If an invalid month is specified...
Definition: kcalendarsystemislamiccivil.cpp:462
KCalendarSystemIslamicCivil::isValid
virtual bool isValid(int year, int month, int day) const
Returns whether a given date is valid in this calendar system.
Definition: kcalendarsystemislamiccivil.cpp:442
KCalendarSystemIslamicCivil::~KCalendarSystemIslamicCivil
virtual ~KCalendarSystemIslamicCivil()
Definition: kcalendarsystemislamiccivil.cpp:415
KCalendarSystem::MonthNameFormat
MonthNameFormat
Format for returned month / day name.
Definition: kcalendarsystem.h:55
KCalendarSystemIslamicCivil::isProleptic
virtual bool isProleptic() const
Returns whether the calendar system is proleptic, i.e.
Definition: kcalendarsystemislamiccivil.cpp:502
KCalendarSystemPrivate::maxMonthsInYear
virtual int maxMonthsInYear() const
Definition: kcalendarsystem.cpp:362
KLocale::ShortNumber
Number at its natural width, e.g.
Definition: klocale.h:910
KCalendarSystem
KCalendarSystem abstract base class, provides support for local Calendar Systems in KDE...
Definition: kcalendarsystem.h:40
KLocale::DateTimeComponentFormat
DateTimeComponentFormat
Definition: klocale.h:908
i18nc
QString i18nc(const char *ctxt, const char *text)
Returns a localized version of a string and a context.
Definition: klocalizedstring.h:797
KCalendarSystemPrivate::daysInYear
virtual int daysInYear(int year) const
Definition: kcalendarsystem.cpp:304
KGlobal::config
KSharedConfigPtr config()
Returns the general config object.
Definition: kglobal.cpp:139
KCalendarSystemPrivate::daysInWeek
virtual int daysInWeek() const
Definition: kcalendarsystem.cpp:315
KCalendarSystemIslamicCivil::earliestValidDate
virtual QDate earliestValidDate() const
Returns the earliest date valid in this calendar system implementation.
Definition: kcalendarsystemislamiccivil.cpp:430
KCalendarSystemIslamicCivil::isLeapYear
virtual bool isLeapYear(int year) const
Returns whether a given year is a leap year.
Definition: kcalendarsystemislamiccivil.cpp:452
KLocale::CalendarSystem
CalendarSystem
Definition: klocale.h:780
QDate::toJulianDay
int toJulianDay() const
KCalendarSystemIslamicCivil::dateToJulianDay
virtual bool dateToJulianDay(int year, int month, int day, int &jd) const
Internal method to convert YMD values for this calendar system into a Julian Day number.
Definition: kcalendarsystemislamiccivil.cpp:569
KLocale::LongName
Long text format, e.g.
Definition: klocale.h:915
KCalendarSystemIslamicCivil::isLunar
virtual bool isLunar() const
Returns whether the calendar is lunar based.
Definition: kcalendarsystemislamiccivil.cpp:487
QDate
QString
KCalendarSystemPrivate::hasLeapMonths
virtual bool hasLeapMonths() const
Definition: kcalendarsystem.cpp:341
kcalendarsystemprivate_p.h
KCalendarSystem::WeekDayNameFormat
WeekDayNameFormat
Format for returned month / day name.
Definition: kcalendarsystem.h:66
KCalendarSystemIslamicCivil::julianDayToDate
virtual bool julianDayToDate(int jd, int &year, int &month, int &day) const
Internal method to convert a Julian Day number into the YMD values for this calendar system...
Definition: kcalendarsystemislamiccivil.cpp:507
KCalendarSystemIslamicCivil::isLunisolar
virtual bool isLunisolar() const
Returns whether the calendar is lunisolar based.
Definition: kcalendarsystemislamiccivil.cpp:492
KCalendarSystemIslamicCivil
Definition: kcalendarsystemislamiccivil_p.h:43
KCalendarSystemIslamicCivil::epoch
virtual QDate epoch() const
Returns a QDate holding the epoch of the calendar system.
Definition: kcalendarsystemislamiccivil.cpp:424
KCalendarSystem::isValid
virtual bool isValid(int year, int month, int day) const =0
Returns whether a given date is valid in this calendar system.
Definition: kcalendarsystem.cpp:1133
KCalendarSystemPrivate::maxDaysInWeek
virtual int maxDaysInWeek() const
Definition: kcalendarsystem.cpp:355
KLocale::ShortName
Short text format, e.g.
Definition: klocale.h:914
KGlobal::locale
KLocale * locale()
Returns the global locale object.
Definition: kglobal.cpp:170
KCalendarSystemPrivate::hasYearZero
virtual bool hasYearZero() const
Definition: kcalendarsystem.cpp:348
KCalendarSystemPrivate
Definition: kcalendarsystemprivate_p.h:31
KCalendarSystemPrivate::monthName
virtual QString monthName(int month, int year, KLocale::DateTimeComponentFormat format, bool possessive=false) const
Definition: kcalendarsystem.cpp:387
KCalendarSystemPrivate::latestValidYear
virtual int latestValidYear() const
Definition: kcalendarsystem.cpp:380
KCalendarSystemPrivate::daysInMonth
virtual int daysInMonth(int year, int month) const
Definition: kcalendarsystem.cpp:285
KLocale
KLocale provides support for country specific stuff like the national language.
Definition: klocale.h:69
KCalendarSystemPrivate::weekDayName
virtual QString weekDayName(int weekDay, KLocale::DateTimeComponentFormat format) const
Definition: kcalendarsystem.cpp:398
KCalendarSystemIslamicCivil::isSolar
virtual bool isSolar() const
Returns whether the calendar is solar based.
Definition: kcalendarsystemislamiccivil.cpp:497
QLatin1String
ki18nc
KLocalizedString ki18nc(const char *ctxt, const char *msg)
Creates localized string from a given message, with added context.
Definition: klocalizedstring.cpp:929
KCalendarSystemPrivate::calendarSystem
virtual KLocale::CalendarSystem calendarSystem() const
Definition: kcalendarsystem.cpp:261
KCalendarSystemIslamicCivil::weekDayName
virtual QString weekDayName(int weekDay, WeekDayNameFormat format=LongDayName) const
Gets specific calendar type week day name.
Definition: kcalendarsystemislamiccivil.cpp:472
KCalendarSystemPrivate::isLeapYear
virtual bool isLeapYear(int year) const
Definition: kcalendarsystem.cpp:322
QDate::fromJulianDay
QDate fromJulianDay(int jd)
kcalendarsystemislamiccivil_p.h
KCalendarSystem::weekDayName
virtual QString weekDayName(int weekDay, WeekDayNameFormat format=LongDayName) const =0
Gets specific calendar type week day name.
Definition: kcalendarsystem.cpp:1881
KLocale::IslamicCivilCalendar
Islamic Civil Calendar, aka Hijri, not the Lunar Calendar.
Definition: klocale.h:792
KCalendarSystemIslamicCivil::KCalendarSystemIslamicCivil
KCalendarSystemIslamicCivil(const KLocale *locale=0)
Definition: kcalendarsystemislamiccivil.cpp:396
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:22:10 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDECore

Skip menu "KDECore"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs API Reference

Skip menu "kdelibs API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal