diff options
Diffstat (limited to 'src/corelib/time/qjuliancalendar.cpp')
-rw-r--r-- | src/corelib/time/qjuliancalendar.cpp | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/src/corelib/time/qjuliancalendar.cpp b/src/corelib/time/qjuliancalendar.cpp index 627c92c48a..1439ae3e00 100644 --- a/src/corelib/time/qjuliancalendar.cpp +++ b/src/corelib/time/qjuliancalendar.cpp @@ -5,8 +5,7 @@ #include "qjuliancalendar_p.h" #include "qromancalendar_data_p.h" #include "qcalendarmath_p.h" -#include <QtCore/qmath.h> -#include <QtCore/qlocale.h> + #include <QtCore/qdatetime.h> QT_BEGIN_NAMESPACE @@ -54,36 +53,32 @@ bool QJulianCalendar::isLeapYear(int year) const if (year == QCalendar::Unspecified || !year) return false; - return qMod(year < 0 ? year + 1 : year, 4) == 0; + return qMod<4>(year < 0 ? year + 1 : year) == 0; } -// Julian Day 0 was January the first in the proleptic Julian calendar's 4713 BC +// Julian Day 0 was January the first in the proleptic Julian calendar's 4713 BC. +using namespace QRomanCalendrical; +// End a Julian four-year cycle on 1 BC's leap day (Gregorian Feb 27th): +constexpr qint64 JulianBaseJd = LeapDayGregorian1Bce - 2; bool QJulianCalendar::dateToJulianDay(int year, int month, int day, qint64 *jd) const { Q_ASSERT(jd); if (!isDateValid(year, month, day)) return false; - if (year < 0) - ++year; - const qint64 c0 = month < 3 ? -1 : 0; - const qint64 j1 = qDiv(1461 * (year + c0), 4); - const qint64 j2 = qDiv(153 * month - 1836 * c0 - 457, 5); - *jd = j1 + j2 + day + 1721117; + + const auto yearDays = yearMonthToYearDays(year, month); + *jd = qDiv<4>(FourYears * yearDays.year) + yearDays.days + day + JulianBaseJd; return true; } QCalendar::YearMonthDay QJulianCalendar::julianDayToDate(qint64 jd) const { - const qint64 y2 = jd - 1721118; - const qint64 k2 = 4 * y2 + 3; - const qint64 k1 = 5 * qDiv(qMod(k2, 1461), 4) + 2; - const qint64 x1 = qDiv(k1, 153); - const qint64 c0 = qDiv(x1 + 2, 12); - const int y = qint16(qDiv(k2, 1461) + c0); - const int month = quint8(x1 - 12 * c0 + 3); - const int day = qDiv(qMod(k1, 153), 5) + 1; - return QCalendar::YearMonthDay(y > 0 ? y : y - 1, month, day); + const auto year4Day = qDivMod<FourYears>(4 * (jd - JulianBaseJd) - 1); + // Its remainder changes by 4 per day, except at roughly yearly quotient steps. + const auto ymd = dayInYearToYmd(qDiv<4>(year4Day.remainder)); + const int y = year4Day.quotient + ymd.year; + return QCalendar::YearMonthDay(y > 0 ? y : y - 1, ymd.month, ymd.day); } QT_END_NAMESPACE |