28 #include <QtCore/QDateTime>
62 lst.append(QLatin1String(
"coptic"));
63 lst.append(QLatin1String(
"ethiopian"));
64 lst.append(QLatin1String(
"gregorian"));
65 lst.append(QLatin1String(
"gregorian-proleptic"));
66 lst.append(QLatin1String(
"hebrew"));
67 lst.append(QLatin1String(
"hijri"));
68 lst.append(QLatin1String(
"indian-national"));
69 lst.append(QLatin1String(
"jalali"));
70 lst.append(QLatin1String(
"japanese"));
71 lst.append(QLatin1String(
"julian"));
72 lst.append(QLatin1String(
"minguo"));
73 lst.append(QLatin1String(
"thai"));
96 switch (calendarSystem) {
148 switch (calendarSystem) {
150 return ki18nc(
"@item Calendar system",
"Gregorian").
toString(locale);
152 return ki18nc(
"@item Calendar system",
"Coptic").
toString(locale);
154 return ki18nc(
"@item Calendar system",
"Ethiopian").
toString(locale);
156 return ki18nc(
"@item Calendar system",
"Gregorian (Proleptic)").
toString(locale);
158 return ki18nc(
"@item Calendar system",
"Hebrew").
toString(locale);
160 return ki18nc(
"@item Calendar system",
"Islamic / Hijri (Civil)").
toString(locale);
162 return ki18nc(
"@item Calendar system",
"Indian National").
toString(locale);
164 return ki18nc(
"@item Calendar system",
"Jalali").
toString(locale);
166 return ki18nc(
"@item Calendar system",
"Japanese").
toString(locale);
168 return ki18nc(
"@item Calendar system",
"Julian").
toString(locale);
170 return ki18nc(
"@item Calendar system",
"Taiwanese").
toString(locale);
175 return ki18nc(
"@item Calendar system",
"Invalid Calendar Type").
toString(locale);
185 if (calendarType == QLatin1String(
"coptic")) {
187 }
else if (calendarType == QLatin1String(
"ethiopian")) {
189 }
else if (calendarType == QLatin1String(
"gregorian")) {
191 }
else if (calendarType == QLatin1String(
"gregorian-proleptic")) {
193 }
else if (calendarType == QLatin1String(
"hebrew")) {
195 }
else if (calendarType == QLatin1String(
"hijri")) {
197 }
else if (calendarType == QLatin1String(
"indian-national")) {
199 }
else if (calendarType == QLatin1String(
"jalali")) {
201 }
else if (calendarType == QLatin1String(
"japanese")) {
203 }
else if (calendarType == QLatin1String(
"julian")) {
205 }
else if (calendarType == QLatin1String(
"minguo")) {
207 }
else if (calendarType == QLatin1String(
"thai")) {
217 return QLatin1String(
"gregorian");
219 return QLatin1String(
"coptic");
221 return QLatin1String(
"ethiopian");
223 return QLatin1String(
"gregorian-proleptic");
225 return QLatin1String(
"hebrew");
227 return QLatin1String(
"indian-national");
229 return QLatin1String(
"hijri");
231 return QLatin1String(
"jalali");
233 return QLatin1String(
"japanese");
235 return QLatin1String(
"julian");
237 return QLatin1String(
"minguo");
239 return QLatin1String(
"thai");
241 return QLatin1String(
"gregorian");
295 if (month == 4 || month == 6 || month == 9 || month == 11) {
329 if (year % 100 != 0) {
331 }
else if (year % 400 == 0) {
392 Q_UNUSED(possessive);
411 switch (weekNumberSystem) {
422 return week(date,
locale()->weekNumberSystem(), yearNum);
432 QDate firstDayWeek1, lastDay;
434 int weekDay1, dayOfWeek1InYear;
445 dayOfWeek1InYear =
dayOfYear(firstDayWeek1);
448 if (
dayOfYear(date) < dayOfWeek1InYear) {
468 firstDayWeek1 =
q->
addDays(firstDayWeek1, -(weekDay1 - 1));
475 week = firstDayWeek1.daysTo(date) /
daysInWeek() + 1;
488 int dayInYear = date.toJulianDay() -
firstDayOfYear(y).toJulianDay();
492 week = week + firstWeekNumber;
521 switch (weekNumberSystem) {
542 int lastWeekInThisYear =
isoWeekNumber(lastDayOfThisYear, &weekYear);
545 if (lastWeekInThisYear < 1 || weekYear != year) {
549 return lastWeekInThisYear;
568 int *yearsDiff,
int *monthsDiff,
int *daysDiff,
int *direction)
const
576 if (toDate < fromDate) {
579 }
else if (toDate > fromDate) {
581 int fromYear =
q->
year(fromDate);
582 int toYear =
q->
year(toDate);
583 int fromMonth =
q->
month(fromDate);
584 int toMonth =
q->
month(toDate);
585 int fromDay =
q->
day(fromDate);
586 int toDay =
q->
day(toDate);
590 int daysInFromMonth =
daysInMonth(fromYear, fromMonth);
594 if (toYear == fromYear) {
596 }
else if (toMonth > fromMonth) {
598 }
else if (toMonth < fromMonth) {
603 if ((toDay >= fromDay) || (fromDay == daysInFromMonth && toDay == daysInToMonth)) {
611 if (toDay >= fromDay) {
612 dm = (monthsInPrevYear + toMonth - fromMonth) % monthsInPrevYear;
613 dd = toDay - fromDay;
620 if (fromDay == daysInFromMonth && toDay == daysInToMonth) {
621 dm = (monthsInPrevYear + toMonth - fromMonth) % monthsInPrevYear;
623 }
else if (prevMonth == fromMonth && daysInPrevMonth < daysInFromMonth) {
626 dm = (monthsInPrevYear + toMonth - fromMonth - 1) % monthsInPrevYear;
627 dd = (daysInFromMonth + toDay - fromDay) % daysInFromMonth;
629 dm = (monthsInPrevYear + toMonth - fromMonth - 1) % monthsInPrevYear;
630 dd = (daysInPrevMonth + toDay - fromDay) % daysInPrevMonth;
658 if (toDate < fromDate) {
662 if (toDate == fromDate) {
666 int fromYear =
q->
year(fromDate);
667 int toYear =
q->
year(toDate);
669 if (toYear == fromYear) {
673 int fromMonth =
q->
month(fromDate);
674 int toMonth =
q->
month(toDate);
676 if (toMonth > fromMonth) {
680 if (toMonth < fromMonth) {
685 int fromDay =
q->
day(fromDate);
686 int toDay =
q->
day(toDate);
691 if ((toDay >= fromDay) ||
705 if (toDate < fromDate) {
709 if (toDate == fromDate) {
713 int fromYear =
q->
year(fromDate);
714 int toYear =
q->
year(toDate);
715 int fromMonth =
q->
month(fromDate);
716 int toMonth =
q->
month(toDate);
717 int fromDay =
q->
day(fromDate);
718 int toDay =
q->
day(toDate);
720 int monthsInPreceedingYears;
723 if (toYear == fromYear) {
724 monthsInPreceedingYears = 0;
726 monthsInPreceedingYears = 0;
727 for (
int y = fromYear; y < toYear; y =
addYears(y, 1)) {
728 monthsInPreceedingYears = monthsInPreceedingYears +
monthsInYear(y);
738 if ((toDay >= fromDay) ||
741 return monthsInPreceedingYears + toMonth - fromMonth;
743 return monthsInPreceedingYears + toMonth - fromMonth - 1;
758 maxLength =
string.length();
761 while (position <
string.length() &&
762 position < maxLength &&
763 string.at(position).isDigit()) {
768 value =
string.left(position).toInt(&ok);
770 readLength = position;
790 if (padChar == QLatin1Char(
'\0') || padWidth == 0) {
793 return q->
locale()->
convertDigits(QString::number(number).rightJustified(padWidth, padChar), digitSet);
802 date = QDate::fromJulianDay(jd);
810 int newYear = originalYear +
addYears;
813 if (originalYear > 0 && newYear <= 0) {
814 newYear = newYear - 1;
815 }
else if (originalYear < 0 && newYear >= 0) {
816 newYear = newYear + 1;
827 int dy = toYear - fromYear;
830 if (toYear > 0 && fromYear < 0) {
832 }
else if (toYear < 0 && fromYear > 0) {
849 for (
int i = 0; i < str.length(); i++) {
850 if (str.at(i).isLetterOrNumber()) {
851 newStr.append(str.at(i));
853 newStr.append(QLatin1Char(
' '));
862 int y, m, d, jdFirstDayOfYear;
866 return (date.toJulianDay() - jdFirstDayOfYear + 1);
875 return ((date.toJulianDay() %
daysInWeek()) + 1);
882 return QDate::fromJulianDay(jd);
890 return QDate::fromJulianDay(jd);
897 return QDate::fromJulianDay(jd);
905 return QDate::fromJulianDay(jd);
924 for (
int i =
m_eraList->count() - 1; i >= 0; --i) {
936 for (
int i =
m_eraList->count() - 1; i >= 0; --i) {
950 QString eraKey = QString::fromLatin1(
"Era1");
952 while (cg.
hasKey(eraKey)) {
954 if (!eraEntry.isEmpty()) {
958 QChar direction = eraEntry.section(QLatin1Char(
':'), 0, 0).at(0);
959 QDate startDate, endDate;
961 QString buffer = eraEntry.section(QLatin1Char(
':'), 2, 2);
962 if (buffer.isEmpty()) {
963 if (direction == QLatin1Char(
'-')) {
972 startYear =
q->
year(startDate);
974 startYear = eraEntry.section(QLatin1Char(
':'), 1, 1).toInt();
977 buffer = eraEntry.section(QLatin1Char(
':'), 3, 3);
978 if (buffer.isEmpty()) {
979 if (direction == QLatin1Char(
'-')) {
987 addEra(direction.toLatin1(), eraEntry.section(QLatin1Char(
':'), 1, 1).toInt(),
988 startDate, startYear, endDate, eraEntry.section(QLatin1Char(
':'), 4, 4),
989 eraEntry.section(QLatin1Char(
':'), 5, 5), eraEntry.section(QLatin1Char(
':'), 6));
992 eraKey = QString::fromLatin1(
"Era%1").arg(i);
1001 const QDate &startDate,
int startYear,
const QDate &endDate,
1007 newEra.m_sequence =
m_eraList->count() + 1;
1008 if (direction ==
'-') {
1009 newEra.m_direction = -1;
1011 newEra.m_direction = 1;
1013 newEra.m_offset = offset;
1014 newEra.m_startDate = startDate;
1015 newEra.m_startYear = startYear;
1016 newEra.m_endDate = endDate;
1017 newEra.m_longName = name;
1018 newEra.m_shortName = shortName;
1019 newEra.m_format = format;
1031 if (inputYear >= 0 && inputYear <= 99) {
1034 if (inputYear >= shortStartYear) {
1035 return inputYear + yearOffset;
1037 return inputYear + yearOffset + 100;
1048 int startYear = 2000;
1050 startYear = cg.
readEntry(
"ShortYearWindowStartYear", 2000);
1067 KConfigGroup calendarGroup = localeGroup.
group(QString::fromLatin1(
"KCalendarSystem %1").arg(calendarType));
1104 return d->calendarSystem();
1117 return QDate::fromJulianDay(38);
1130 return QDate::fromJulianDay(5373484);
1138 (!d->hasYearZero() && year == 0)) {
1142 if (month < 1 || month > d->monthsInYear(year)) {
1146 if (day < 1 || day > d->daysInMonth(year, month)) {
1158 return (
isValid(year, 1, 1) && dayOfYear > 0 && dayOfYear <= d->
daysInYear(year));
1182 if (isoWeekNumber < 1 || isoWeekNumber > weeksInThisYear) {
1187 if (dayOfIsoWeek < 1 || dayOfIsoWeek > d->daysInWeek()) {
1193 if (year == d->earliestValidYear() && isoWeekNumber == 1) {
1197 int dowFirstDay =
dayOfWeek(d->firstDayOfYear(year));
1198 if (dowFirstDay <= 4 && dayOfIsoWeek < dowFirstDay) {
1201 }
else if (year == d->latestValidYear() && isoWeekNumber == weeksInThisYear) {
1205 int dowLastDay =
dayOfWeek(d->lastDayOfYear(year));
1206 if (dowLastDay >= 4 && dayOfIsoWeek > dowLastDay) {
1216 if (date.isNull() || date < earliestValidDate() || date >
latestValidDate()) {
1226 date = d->invalidDate();
1228 if (
isValid(year, month, day)) {
1231 QDate calcDate = QDate::fromJulianDay(jd);
1247 date = d->invalidDate();
1249 if (
isValid(year, dayOfYear)) {
1252 QDate calcDate = QDate::fromJulianDay(jd + dayOfYear - 1);
1276 date = d->invalidDate();
1280 QDate calcDate = d->firstDayOfYear(year);
1281 int dowFirstDayOfYear =
dayOfWeek(calcDate);
1283 int daysToAdd = (d->daysInWeek() * (isoWeekNumber - 1)) + dayOfIsoWeek;
1285 if (dowFirstDayOfYear <= 4) {
1286 calcDate = calcDate.addDays(daysToAdd - dowFirstDayOfYear);
1288 calcDate = calcDate.addDays(
daysInWeek(calcDate) + daysToAdd - dowFirstDayOfYear);
1303 return setDate(date, year, month, day);
1393 return formatDate(date, d->era(date).format());
1405 return d->era(date).yearInEra(
year(date));
1416 return d->eraList();
1420 KCalendarEra KCalendarSystem::era(
const QDate &eraDate)
const
1424 return d->era(eraDate);
1432 return d->era(eraName, yearInEra);
1441 int originalYear, originalMonth, originalDay;
1442 julianDayToDate(date.toJulianDay(), originalYear, originalMonth, originalDay);
1444 int newYear = d->addYears(originalYear, numYears);
1445 int newMonth = originalMonth;
1446 int newDay = originalDay;
1449 int daysInNewMonth = d->daysInMonth(newYear, newMonth);
1450 if (daysInNewMonth < originalDay) {
1451 newDay = daysInNewMonth;
1455 setDate(newDate, newYear, newMonth, newDay);
1460 return d->invalidDate();
1469 int originalYear, originalMonth, originalDay;
1470 julianDayToDate(date.toJulianDay(), originalYear, originalMonth, originalDay);
1472 int monthsInOriginalYear = d->monthsInYear(originalYear);
1474 int newYear = d->addYears(originalYear, (originalMonth + numMonths) / monthsInOriginalYear);
1475 int newMonth = (originalMonth + numMonths) % monthsInOriginalYear;
1476 int newDay = originalDay;
1478 if (newMonth == 0) {
1479 newYear = d->addYears(newYear, - 1);
1480 newMonth = monthsInOriginalYear;
1483 newYear = d->addYears(newYear, - 1);
1484 newMonth = newMonth + monthsInOriginalYear;
1488 int daysInNewMonth = d->daysInMonth(newYear, newMonth);
1489 if (daysInNewMonth < originalDay) {
1490 newDay = daysInNewMonth;
1494 setDate(newDate, newYear, newMonth, newDay);
1499 return d->invalidDate();
1507 if (
isValid(date) && (
long) date.toJulianDay() + (long) numDays > 0) {
1509 QDate temp = date.addDays(numDays);
1515 return d->invalidDate();
1520 int *yearsDiff,
int *monthsDiff,
int *daysDiff,
int *direction)
const
1525 d->dateDifference(fromDate, toDate, yearsDiff, monthsDiff, daysDiff, direction);
1535 return d->yearsDifference(fromDate, toDate);
1547 return d->monthsDifference(fromDate, toDate);
1557 return toDate.toJulianDay() - fromDate.toJulianDay();
1568 return d->monthsInYear(
year(date));
1580 return d->monthsInYear(year);
1602 return d->weeksInYear(
year(date), weekNumberSystem);
1614 return d->weeksInYear(year, weekNumberSystem);
1625 return d->daysInYear(
year(date));
1637 return d->daysInYear(year);
1649 getDate(date, &year, &month, 0);
1650 return d->daysInMonth(year, month);
1662 return d->daysInMonth(year, month);
1672 return d->daysInWeek();
1680 return d->dayOfYear(date);
1691 return d->dayOfWeek(date);
1714 return d->week(date, weekNumberSystem, yearNum);
1725 return d->isLeapYear(year);
1736 return d->isLeapYear(
year(date));
1748 return d->firstDayOfYear(year);
1760 return d->lastDayOfYear(year);
1772 return d->firstDayOfYear(
year(date));
1784 return d->lastDayOfYear(
year(date));
1795 if (
isValid(year, month, 1)) {
1796 return d->firstDayOfMonth(year, month);
1807 if (
isValid(year, month, 1)) {
1808 return d->lastDayOfMonth(year, month);
1821 getDate(date, &year, &month, 0);
1822 return d->firstDayOfMonth(year, month);
1835 getDate(date, &year, &month, 0);
1836 return d->lastDayOfMonth(year, month);
1846 if (!
isValid(year, month, 1)) {
1874 getDate(date, &year, &month, 0);
1885 if (weekDay < 1 || weekDay > d->daysInWeek()) {
2022 QString minus =
i18nc(
"Negative symbol as used for year numbers, e.g. -5 = 5 BC",
"-");
2023 if (yearString.startsWith(minus)) {
2024 int value = d->integerFromString(yearString.mid(minus.length()), 4, readLength);
2025 if (readLength > 0 && value >= 0) {
2026 readLength = readLength + minus.length();
2033 return d->integerFromString(yearString, 4, readLength);
2039 return d->integerFromString(monthString, 2, readLength);
2045 return d->integerFromString(dayString, 2, readLength);
2050 if (!fromDate.isValid()) {
2056 int daysToNow = fromDate.daysTo(now);
2057 switch (daysToNow) {
2059 return i18n(
"Today");
2061 return i18n(
"Yesterday");
2078 return formatDate(fromDate, QLatin1String(
"%Y-%m-%d"));
2080 return formatDate(fromDate, QLatin1String(
"%Y-W%V-%u"));
2082 return formatDate(fromDate, QLatin1String(
"%Y-%j"));
2095 return formatDate(fromDate, toFormat,
locale()->dateTimeDigitSet(), standard);
2102 if (!
isValid(fromDate) || toFormat.isEmpty()) {
2107 return formatter.
formatDate(fromDate, toFormat,
this,
locale(), digitSet, formatStandard);
2117 switch (component) {
2124 return formatDate(date, QLatin1String(
"%y"));
2129 return formatDate(date, QLatin1String(
"%Y"));
2140 return formatDate(date, QLatin1String(
"%m"));
2144 return formatDate(date, QLatin1String(
"%n"));
2164 return formatDate(date, QLatin1String(
"%d"));
2170 return formatDate(date, QLatin1String(
"%e"));
2173 return d->stringFromInteger(date.toJulianDay(), 0);
2202 return formatDate(date, QLatin1String(
"%4Ey"));
2208 return formatDate(date, QLatin1String(
"%Ey"));
2215 return formatDate(date, QLatin1String(
"%j"));
2221 return formatDate(date, QLatin1String(
"%-j"));
2235 return formatDate(date, QLatin1String(
"%-u"));
2254 return d->stringFromInteger(
week(date, weekNumberSystem, 0), 2, QLatin1Char(
'0'));
2260 return d->stringFromInteger(
week(date, weekNumberSystem, 0), 0, QLatin1Char(
'0'));
2265 week(date, weekNumberSystem, &weekYear);
2266 setDate(yearDate, weekYear, 1, 1);
2273 return d->stringFromInteger(
monthsInYear(date), 2, QLatin1Char(
'0'));
2279 return d->stringFromInteger(
monthsInYear(date), 0, QLatin1Char(
'0'));
2285 return d->stringFromInteger(
weeksInYear(date), 2, QLatin1Char(
'0'));
2291 return d->stringFromInteger(
weeksInYear(date), 0, QLatin1Char(
'0'));
2297 return d->stringFromInteger(
daysInYear(date), 3, QLatin1Char(
'0'));
2303 return d->stringFromInteger(
daysInYear(date), 0, QLatin1Char(
'0'));
2309 return d->stringFromInteger(
daysInMonth(date), 2, QLatin1Char(
'0'));
2315 return d->stringFromInteger(
daysInMonth(date), 0, QLatin1Char(
'0'));
2326 return d->stringFromInteger(d->daysInWeek(), 0);
2363 return readDate(str, QLatin1String(
"%Y-%m-%d"), ok);
2365 return readDate(str, QLatin1String(
"%Y-W%V-%u"), ok);
2367 return readDate(str, QLatin1String(
"%Y-%j"), ok);
2369 return d->invalidDate();
2382 QDate resultDate = parser.
parseDate(inputString, formatString,
this,
locale(),
locale()->dateTimeDigitSet(), formatStandard);
2384 *ok = resultDate.isValid();
2394 return d->shortYearWindowStartYear();
2402 return d->applyShortYearWindow(inputYear);
2424 int b = ((4 * a) + 3) / 146097;
2425 int c = a - ((146097 * b) / 4);
2426 int d = ((4 * c) + 3) / 1461;
2427 int e = c - ((1461 * d) / 4);
2428 int m = ((5 * e) + 2) / 153;
2429 day = e - (((153 * m) + 2) / 5) + 1;
2430 month = m + 3 - (12 * (m / 10));
2431 year = (100 * b) + d - 4800 + (m / 10);
2464 int a = (14 -
month) / 12;
2466 int m = month + (12 * a) - 3;
2469 + (((153 * m) + 2) / 5)