2
0

datetime.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "datetime.h"
  2. namespace OPL {
  3. QDate DateTime::parseInput(QString &user_input, OPL::DateFormat format)
  4. {
  5. // Try input string
  6. const QString &format_string = DATEFORMATSMAP.value(format);
  7. QDate return_date = QDate::fromString(user_input, format_string);
  8. if (return_date.isValid())
  9. return return_date;
  10. // try to fix the user input
  11. tryToFix(user_input, format);
  12. return QDate::fromString(user_input, format_string);
  13. }
  14. void DateTime::tryToFix(QString &user_input, OPL::DateFormat format)
  15. {
  16. if (user_input.length() < 10) {
  17. if (containsSeperator(user_input)) {
  18. padZeroes(user_input);
  19. }
  20. else {
  21. addSeperators(user_input, format);
  22. padZeroes(user_input);
  23. }
  24. }
  25. if (user_input.length() == 8)
  26. padCentury(user_input, format);
  27. }
  28. // Input contains seperators and is of length 8
  29. void DateTime::padCentury(QString &user_input, OPL::DateFormat format)
  30. {
  31. switch (format) {
  32. case OPL::DateFormat::ISODate: {
  33. int year = user_input.left(2).toInt();
  34. if (year > 50)
  35. user_input.prepend(QStringLiteral("19"));
  36. else
  37. user_input.prepend(QStringLiteral("20"));
  38. break;
  39. }
  40. case OPL::DateFormat::DE: {
  41. int year = user_input.right(2).toInt();
  42. if (year > 50)
  43. user_input.insert(6, QStringLiteral("19"));
  44. else
  45. user_input.insert(6, QStringLiteral("20"));
  46. break;
  47. }
  48. case OPL::DateFormat::EN: {
  49. int year = user_input.right(2).toInt();
  50. if (year > 50)
  51. user_input.insert(6, QStringLiteral("19"));
  52. else
  53. user_input.insert(6, QStringLiteral("20"));
  54. break;
  55. }
  56. }
  57. DEB << "Padded century: " << user_input;
  58. }
  59. void DateTime::padZeroes(QString &user_input)
  60. {
  61. const static auto unpadded_start = QRegularExpression(QStringLiteral("^\\d{1}\\W"));
  62. const static auto unpadded_middle = QRegularExpression(QStringLiteral("\\W\\d\\W"));
  63. const static auto unpadded_end = QRegularExpression(QStringLiteral("\\W\\d$"));
  64. auto match = unpadded_start.match(user_input);
  65. if (match.hasMatch())
  66. user_input.insert(match.capturedStart(), QLatin1Char('0'));
  67. match = unpadded_middle.match(user_input);
  68. if (match.hasMatch())
  69. user_input.insert(match.capturedStart() + 1, QLatin1Char('0'));
  70. match = unpadded_end.match(user_input);
  71. if (match.hasMatch())
  72. user_input.insert(match.capturedStart() + 1, QLatin1Char('0'));
  73. DEB << "Padded zeroes: " << user_input;
  74. }
  75. // 10.10.2020
  76. void DateTime::addSeperators(QString &user_input, const OPL::DateFormat &format)
  77. {
  78. switch (format) {
  79. case OPL::DateFormat::ISODate:
  80. if (user_input.length() > 7) {
  81. user_input.insert(4, QLatin1Char('-'));
  82. user_input.insert(7, QLatin1Char('-'));
  83. } else {
  84. user_input.insert(2, QLatin1Char('-'));
  85. user_input.insert(5, QLatin1Char('-'));
  86. }
  87. break;
  88. case OPL::DateFormat::DE:
  89. user_input.insert(2, QLatin1Char('.'));
  90. user_input.insert(5, QLatin1Char('.'));
  91. break;
  92. case OPL::DateFormat::EN:
  93. user_input.insert(2, QLatin1Char('/'));
  94. user_input.insert(5, QLatin1Char('/'));
  95. break;
  96. }
  97. DEB << "Added Seperators: " << user_input;
  98. }
  99. bool DateTime::containsSeperator(const QString &user_input)
  100. {
  101. if (user_input.contains(QLatin1Char('.')))
  102. return true;
  103. if (user_input.contains(QLatin1Char('-')))
  104. return true;
  105. if (user_input.contains(QLatin1Char('/')))
  106. return true;
  107. DEB << "No Seperators found.";
  108. return false;
  109. }
  110. const QStringList& DateTime::getDisplayNames()
  111. {
  112. return DISPLAY_NAMES;
  113. }
  114. const QString DateTime::getFormatString(OPL::DateFormat format)
  115. {
  116. return DATEFORMATSMAP.value(format);
  117. }
  118. const QString DateTime::currentDate()
  119. {
  120. return QDate::currentDate().toString(Qt::ISODate);
  121. }
  122. } // namespace OPL