26 #if QT_VERSION < QT_VERSION_CHECK(5,0,0)
28 #include <KCalendarSystem>
31 #include <QRegularExpression>
32 #include <QRegularExpressionMatch>
54 m_errorMessage = QString(
"Invalid format character '%1'").arg(arg1);
69 m_errorMessage = QString(
"Length of year (%1) does not match expected length (%2).").arg(arg1, arg2);
79 #if QT_VERSION >= QT_VERSION_CHECK(5,8,0)
80 date = QDateTime::fromSecsSinceEpoch(_in.toUInt(), Qt::UTC).date();
82 date = QDateTime::fromTime_t(_in.toUInt()).date();
85 const QString skroogeFormat =
m_format;
89 QRegExp formatrex(
"([mdy]+)(\\W+)([mdy]+)(\\W+)([mdy]+)", Qt::CaseInsensitive);
90 if (formatrex.indexIn(
m_format) == -1) {
105 if (!date.isValid()) {
108 if (!
m_format.contains(QStringLiteral(
"yyyy")) && date.year() < 2000)
109 date = date.addYears(100);
114 #if QT_VERSION < QT_VERSION_CHECK(5,0,0)
122 QRegExp formatrex(
"%([mdy]+)(\\W+)%([mdy]+)(\\W+)%([mdy]+)", Qt::CaseInsensitive);
123 if (formatrex.indexIn(
m_format) == -1) {
127 QStringList formatParts;
128 formatParts += formatrex.cap(1);
129 formatParts += formatrex.cap(3);
130 formatParts += formatrex.cap(5);
132 QStringList formatDelimiters;
133 formatDelimiters += formatrex.cap(2);
134 formatDelimiters += formatrex.cap(4);
137 QStringList::iterator it;
138 QRegExp specialChars(
"^[\\.\\\\\\?]$");
139 for(it = formatDelimiters.begin(); it != formatDelimiters.end(); ++it) {
140 if (specialChars.indexIn(*it) != -1)
150 inputrex.setCaseSensitivity(Qt::CaseInsensitive);
155 inputrex.setPattern(QString(
"(\\w+)\\.?%1(\\w+)\\.?%2(\\w+)\\.?").arg(formatDelimiters[0],
156 formatDelimiters[1]));
158 inputrex.setPattern(
"(\\w+)\\W+(\\w+)\\W+(\\w+)");
161 if (inputrex.indexIn(_in) == -1) {
165 QStringList scannedParts;
166 scannedParts += inputrex.cap(1).toLower();
167 scannedParts += inputrex.cap(2).toLower();
168 scannedParts += inputrex.cap(3).toLower();
173 unsigned day = 0, month = 0, year = 0;
175 QRegExp digitrex(
"(\\d+)");
176 QStringList::const_iterator it_scanned = scannedParts.constBegin();
177 QStringList::const_iterator it_format = formatParts.constBegin();
178 while (it_scanned != scannedParts.constEnd()) {
180 switch ((*it_format).at(0).cell()) {
184 if (digitrex.indexIn(*it_scanned) != -1) {
185 day = digitrex.cap(1).toUInt(&ok);
187 if (!ok || day > 31) {
192 month = (*it_scanned).toUInt(&ok);
197 if (KGlobal::locale()->calendar()->monthName(i, 2000).toLower() == *it_scanned
198 || KGlobal::locale()->calendar()->monthName(i, 2000,
199 KCalendarSystem::ShortName).
200 toLower() == *it_scanned) {
207 if (month < 1 || month > 12) {
213 if (_strict && (*it_scanned).length() != (*it_format).length()) {
217 year = (*it_scanned).toUInt(&ok);
230 unsigned centuryend = _centurymidpoint + 50;
231 unsigned centurybegin = _centurymidpoint - 50;
233 if (year < centuryend % 100) {
236 year += centurybegin - centurybegin % 100;
251 QDate result(year, month, day);
252 if (!result.isValid()) {
267 QRegularExpression formatrex(
"%([mdy]+)(\\W+)%([mdy]+)(\\W+)%([mdy]+)", QRegularExpression::CaseInsensitiveOption);
268 QRegularExpressionMatch match = formatrex.match(
m_format);
269 if (!match.hasMatch()) {
273 QStringList formatParts;
274 formatParts += match.captured(1);
275 formatParts += match.captured(3);
276 formatParts += match.captured(5);
278 QStringList formatDelimiters;
279 formatDelimiters += match.captured(2);
280 formatDelimiters += match.captured(4);
283 QStringList::iterator it;
284 QRegularExpression specialChars(
"^[\\.\\\\\\?]$");
285 for(it = formatDelimiters.begin(); it != formatDelimiters.end(); ++it) {
286 QRegularExpressionMatch special = specialChars.match(*it);
287 if (special.hasMatch()) {
296 QRegularExpression inputrex;
297 inputrex.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
302 inputrex.setPattern(QString(
"(\\w+)\\.?%1(\\w+)\\.?%2(\\w+)\\.?").arg(formatDelimiters[0], formatDelimiters[1]));
304 inputrex.setPattern(
"(\\w+)\\W+(\\w+)\\W+(\\w+)");
306 match = inputrex.match(_in);
307 if (!match.hasMatch()) {
311 QStringList scannedParts;
312 scannedParts += match.captured(1).toLower();
313 scannedParts += match.captured(2).toLower();
314 scannedParts += match.captured(3).toLower();
319 unsigned day = 0, month = 0, year = 0;
321 QRegularExpression digitrex(
"(\\d+)");
322 QStringList::const_iterator it_scanned = scannedParts.constBegin();
323 QStringList::const_iterator it_format = formatParts.constBegin();
324 while (it_scanned != scannedParts.constEnd()) {
326 switch ((*it_format).at(0).cell()) {
330 match = digitrex.match(*it_scanned);
331 if (match.hasMatch())
332 day = match.captured(1).toUInt(&ok);
337 month = (*it_scanned).toUInt(&ok);
345 if (locale.standaloneMonthName(i).toLower() == *it_scanned
346 || locale.standaloneMonthName(i, QLocale::ShortFormat).toLower() == *it_scanned) {
355 QLocale localeC(QLocale::C);
356 if( !(locale == localeC)) {
359 if (localeC.standaloneMonthName(i).toLower() == *it_scanned
360 || localeC.standaloneMonthName(i, QLocale::ShortFormat).toLower() == *it_scanned) {
370 if (month < 1 || month > 12)
375 if (_strict && (*it_scanned).length() != (*it_format).length())
378 year = (*it_scanned).toUInt(&ok);
390 unsigned centuryend = _centurymidpoint + 50;
391 unsigned centurybegin = _centurymidpoint - 50;
393 if (year < centuryend % 100)
395 year += centurybegin - centurybegin % 100;
409 QDate result(year, month, day);
410 if (! result.isValid())