File indexing completed on 2024-10-13 09:31:26
0001 /* 0002 Copyright 2010 John Layt <john@layt.net> 0003 0004 This library is free software; you can redistribute it and/or 0005 modify it under the terms of the GNU Library General Public 0006 License as published by the Free Software Foundation; either 0007 version 2 of the License, or (at your option) any later version. 0008 0009 This library is distributed in the hope that it will be useful, 0010 but WITHOUT ANY WARRANTY; without even the implied warranty of 0011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0012 Library General Public License for more details. 0013 0014 You should have received a copy of the GNU Library General Public License 0015 along with this library; see the file COPYING.LIB. If not, write to 0016 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0017 Boston, MA 02110-1301, USA. 0018 */ 0019 0020 #ifndef KLOCALIZEDDATE_H 0021 #define KLOCALIZEDDATE_H 0022 0023 #include <QString> 0024 #include <QDate> 0025 0026 #include <kdelibs4support_export.h> 0027 #include "klocale.h" 0028 0029 class KLocalizedDatePrivate; 0030 /** 0031 * @short A class representing a date localized using the local calendar system, language and formats 0032 * 0033 * Topics: 0034 * - @ref intro 0035 * - @ref calsys 0036 * - @ref custom 0037 * - @ref formatting 0038 * - @ref maths 0039 * 0040 * @section intro Introduction 0041 * 0042 * This class provides a simple and convenient way to localize dates 0043 * 0044 * @section calsys Calendar System 0045 * 0046 * KDE supports the use of different calendar systems. 0047 * 0048 * @section custom Default and Custom Locale and Calendar System 0049 * 0050 * In most cases you will want to use the default Global Locale and Calendar 0051 * System, in which case you need only create a default KLocalizedDate. If 0052 * however you specifically need a different Calendar System or Locale settings 0053 * then you need to take some extra steps. 0054 * 0055 * The simplest method is just changing the Calendar System while keeping the 0056 * current Locale settings. This is easily done using setCalendarSystem() 0057 * which will copy the current Locale being used and apply this to the new 0058 * Calendar System. Note this means any changes to the old locale settings, 0059 * either the Global Locale or a custom Locale (see below) will not apply 0060 * to that date instance. 0061 * 0062 * You may however wish to use a custom Locale with the Calendar System. 0063 * For example, if you want your app to normally show dates using the Global 0064 * Locale and Calendar System, but wish to show an info box with the Islamic 0065 * date in Arabic language and format, then you need a custom Locale to do 0066 * this. 0067 * 0068 * \code 0069 * KLocale *myLocale = new KLocale("myapp", "ar", "eg"); 0070 * KCalendarSystem *myCalendar = KCalendarSystem::create(KLocale::IslamicCivilCalendar, myLocale); 0071 * KLocalizedDate myDate(QDate(2010,1,1), myCalendar); 0072 * \endcode 0073 * 0074 * In this case you are responsible for the memory management of the KLocale 0075 * and KCalendarSystem. This allows you to reuse this calendar across multiple 0076 * date instances without it being deleted under you. It also allows you to 0077 * change any setting in the Locale and have it apply across all those date 0078 * instances. @warning Don't try changing the Calendar System via your Locale 0079 * instance, your KCalendarSystem instance will be deleted and all the dates 0080 * will be invalid! 0081 * 0082 * @see 0083 * 0084 * @section formatting Date Formatting 0085 * 0086 * When you display dates or date components to users in a GUI, they will 0087 * expect them to be displayed in their language and digit set following their 0088 * local date formatting conventions. Directly displaying values returned by 0089 * the normal date component methods such as day() will not conform to these 0090 * expectations, so you need to use different methods to obtain the localized 0091 * string form of the date or component. 0092 * 0093 * You can either format the entire date, or just a single component of the 0094 * date such as the month or day. 0095 * 0096 * When formatting a full date, it is preferred to use one of the standard date 0097 * formats defined in the Locale, although you can provide your own format in 0098 * either the KDE, POSIX, or UNICODE standards. 0099 * 0100 * @see formatDate() formatDate() 0101 * 0102 * @section parsing Date Parsing 0103 * 0104 * Basic concepts on date parsing, then full details on KLocale::ReadDateFlags 0105 * formats, definging your own date format strings, and setting how strictly 0106 * the format is appplied. 0107 * 0108 * You can choose how strictly a date format is applied in parsing. Currently 0109 * only liberal Parsing is supported. 0110 * 0111 * The KLocale::LiberalParsing mode applies the following rules: 0112 * 0113 * 1) You must supply a format and string containing at least one of the following combinations to 0114 * create a valid date: 0115 * @li a month and day of month 0116 * @li a day of year 0117 * @li a ISO week number and day of week 0118 * 0119 * 2) If a year number is not supplied then the current year will be assumed. 0120 * 0121 * 3) All date components must be separated by a non-numeric character. 0122 * 0123 * 4) The format is not applied strictly to the input string: 0124 * @li extra whitespace is ignored 0125 * @li leading 0's on numbers are ignored 0126 * @li capitalisation of literals is ignored 0127 * 0128 * @see readDate() 0129 * 0130 * @section maths Date Maths 0131 * 0132 * A full set of date maths functions are provided which operate in a consistent 0133 * manner, i.e. you can safely round-trip. 0134 * 0135 */ 0136 0137 class KDELIBS4SUPPORT_EXPORT KLocalizedDate 0138 { 0139 public: 0140 0141 /** 0142 * Constructs a localized date with the given date. 0143 * 0144 * By default, uses the global Calendar System and Locale. 0145 * 0146 * If you pass in a custom Calendar System then you retain ownership of it 0147 * and are responsible for deleting it. This allows you to reuse the same 0148 * custom Calendar System for many localized date instances. 0149 * 0150 * See @ref custom for more details on using custom Calendar Systems. 0151 * 0152 * @param date the QDate to set the KLocalizedDate to, defaults to invalid date 0153 * @param calendar the calendar system to use, defaults to the global 0154 */ 0155 KDELIBS4SUPPORT_DEPRECATED explicit KLocalizedDate(const QDate &date = QDate(), const KCalendarSystem *calendar = nullptr); 0156 0157 /** 0158 * Constructs a localized date with the given year, month and day. 0159 * 0160 * By default, uses the global Calendar System and Locale. 0161 * 0162 * If you pass in a custom Calendar System then you retain ownership of it 0163 * and are responsible for deleting it. This allows you to reuse the same 0164 * custom Calendar System for many localized date instances. 0165 * 0166 * See @ref custom for more details on using custom Calendar Systems. 0167 * 0168 * @param year the year to set the KLocalizedDate to 0169 * @param month the month to set the KLocalizedDate to 0170 * @param day the day to set the KLocalizedDate to 0171 * @param calendar the calendar system to use, defaults to the global 0172 */ 0173 KLocalizedDate(int year, int month, int day, const KCalendarSystem *calendar = nullptr); 0174 0175 /** 0176 * Copy constructor 0177 * 0178 * @param rhs the date to copy 0179 */ 0180 KLocalizedDate(const KLocalizedDate &rhs); 0181 0182 /** 0183 * Assignment operator 0184 * 0185 * @param rhs the date to assign 0186 */ 0187 KLocalizedDate &operator=(const KLocalizedDate &rhs); 0188 0189 /** 0190 * Assignment operator 0191 * 0192 * @param rhs the date to assign 0193 */ 0194 KLocalizedDate &operator=(const QDate &rhs); 0195 0196 /** 0197 * Destructor. 0198 */ 0199 ~KLocalizedDate(); 0200 0201 /** 0202 * Set the Calendar System used for this date instance only. 0203 * 0204 * This method is mostly useful for when you quickly want to see what the 0205 * currently set date would look like in a different Calendar System but 0206 * using the same Locale. 0207 * 0208 * When the Calendar System is changed, a copy will be taken of the Locale 0209 * previously used and this copy will be applied to the new Calendar System. 0210 * Any changes to the old Locale settings, either the Global or a Custom 0211 * Locale, will not be applied to this date instance. 0212 * 0213 * See @ref custom for more details on using custom Calendar Systems. 0214 * 0215 * @see KLocale::CalendarSystem 0216 * @see calendarSystem() 0217 * @param calendarSystem the Calendar System to use 0218 */ 0219 void setCalendarSystem(KLocale::CalendarSystem calendarSystem); 0220 0221 /** 0222 * Returns the Calendar System used by this localized date instance 0223 * 0224 * @see KLocale::CalendarSystem 0225 * @see setCalendarSystem() 0226 * @return the Calendar System currently used 0227 */ 0228 KLocale::CalendarSystem calendarSystem(); 0229 0230 /** 0231 * Returns a pointer to the Calendar System object used by this date instance. 0232 * 0233 * Usually this will be the Global Calendar System, but this may have been 0234 * changed. 0235 * 0236 * Normally you will not need to access this object unless the KLocalizedDate 0237 * API does not provide the methods you require. 0238 * 0239 * @see KCalendarSystem 0240 * @see calendarSystem 0241 * @see setCalendarSystem 0242 * @return the current calendar system instance 0243 */ 0244 const KCalendarSystem *calendar() const; 0245 0246 /** 0247 * Returns whether the date is null, i.e. invalid in any Calendar System. 0248 * 0249 * @see isValid 0250 * @return @c true if the date is null, @c false otherwise 0251 */ 0252 bool isNull() const; 0253 0254 /** 0255 * Returns whether the date is valid in the current Calendar System. 0256 * 0257 * @see isNull 0258 * @return @c true if the date is valid, @c false otherwise 0259 */ 0260 bool isValid() const; 0261 0262 /** 0263 * Set the date using a QDate. 0264 * 0265 * @param date the QDate to set to 0266 * @return @c true if the date is valid, @c false otherwise 0267 */ 0268 bool setDate(const QDate &date); 0269 0270 /** 0271 * Set the date's year, month and day. 0272 * 0273 * The range of the year, month and day, and the validity of the date as a 0274 * whole depends on which Calendar System is being used. 0275 * 0276 * @see getDate() 0277 * @param year year number 0278 * @param month month of year number 0279 * @param day day of month 0280 * @return @c true if the date is valid, @c false otherwise 0281 */ 0282 bool setDate(int year, int month, int day); 0283 0284 /** 0285 * Set the date using the year number and day of year number only. 0286 * 0287 * @see dayOfYear() 0288 * @param year year 0289 * @param dayOfYear day of year 0290 * @return @c true if the date is valid, @c false otherwise 0291 */ 0292 bool setDate(int year, int dayOfYear); 0293 0294 /** 0295 * Set the date using the era, year in era number, month and day 0296 * 0297 * @see eraName() 0298 * @see yearInEra() 0299 * @param eraName Era string 0300 * @param yearInEra Year In Era number 0301 * @param month Month number 0302 * @param day Day Of Month number 0303 * @return @c true if the date is valid, @c false otherwise 0304 */ 0305 bool setDate(QString eraName, int yearInEra, int month, int day); 0306 0307 /** 0308 * Set the date using the year, week and day of week. 0309 * 0310 * Currently only the ISO Week Number System is supported. 0311 * 0312 * @see week() 0313 * @see dayOfWeek() 0314 * @param weekNumberSystem the week number system to use 0315 * @param year year 0316 * @param weekOfYear week of year 0317 * @param dayOfWeek day of week Mon..Sun (1..7) 0318 * @return @c true if the date is valid, @c false otherwise 0319 */ 0320 bool setDate(KLocale::WeekNumberSystem weekNumberSystem, int year, int weekOfYear, int dayOfWeek); 0321 0322 /** 0323 * Set the date to today's date 0324 * 0325 * @see currentDate() 0326 * @return @c true if the date is valid, @c false otherwise 0327 */ 0328 bool setCurrentDate(); 0329 0330 /** 0331 * Returns a KLocalizedDate set to today's date in the Global Locale and 0332 * Calendar System. 0333 * 0334 * @see setCurrentDate() 0335 * @return today's localized date 0336 */ 0337 static KLocalizedDate currentDate(); 0338 0339 /** 0340 * Returns a KLocalizedDate set the required date in the Global Locale and 0341 * Calendar System. 0342 * 0343 * @param date the date to set to 0344 * @return a localized date 0345 */ 0346 static KLocalizedDate fromDate(const QDate &date); 0347 0348 /** 0349 * Returns a KLocalizedDate set the required Julian Day number in the Global 0350 * Locale and Calendar System. 0351 * 0352 * @see toJulianDay() 0353 * @param jd the Julian Day number to set to 0354 * @return a localized date 0355 */ 0356 static KLocalizedDate fromJulianDay(int jd); 0357 0358 /** 0359 * Returns the currently set date as a Julian Day number 0360 * 0361 * @see fromJulianDay() 0362 * @return the currently set date as a Julian Day number 0363 */ 0364 int toJulianDay() const; 0365 0366 /** 0367 * Returns the currently set date as a QDate 0368 * 0369 * @return the currently set date as a QDate 0370 */ 0371 QDate date() const; 0372 0373 /** 0374 * Returns the year, month and day portion of the date in the current 0375 * Calendar System. 0376 * 0377 * See @ref formatting for why you should never display this value. 0378 * 0379 * @see setDate() 0380 * @see formatDate() 0381 * @param year year number returned in this variable 0382 * @param month month number returned in this variable 0383 * @param day day of month returned in this variable 0384 */ 0385 void getDate(int *year, int *month, int *day) const; 0386 0387 /** 0388 * Returns the year portion of the date in the current calendar system 0389 * 0390 * See @ref formatting for why you should never display this value. 0391 * 0392 * @see formatDate() 0393 * @return the localized year number 0394 */ 0395 int year() const; 0396 0397 /** 0398 * Returns the month portion of the date in the current calendar system 0399 * 0400 * See @ref formatting for why you should never display this value. 0401 * 0402 * @see formatDate() 0403 * @return the localized month number, 0 if date is invalid 0404 */ 0405 int month() const; 0406 0407 /** 0408 * Returns the day portion of the date in the current calendar system 0409 * 0410 * See @ref formatting for why you should never display this value. 0411 * 0412 * @see formatDate() 0413 * @return the localized day number, 0 if date is invalid 0414 */ 0415 int day() const; 0416 0417 /** 0418 * Returns the Era Name portion of the date in the current calendar system, 0419 * for example "AD" or "Anno Domini" for the Gregorian calendar and Christian Era. 0420 * 0421 * See @ref formatting for more details on Date Formatting. 0422 * 0423 * @see formatDate() 0424 * @return the localized era name, empty string if date is invalid 0425 */ 0426 QString eraName() const; 0427 0428 /** 0429 * Returns the Era Year portion of the date in the current 0430 * calendar system, for example "2000 AD" or "Heisei 22". 0431 * 0432 * See @ref formatting for more details on Date Formatting. 0433 * 0434 * @see formatDate() 0435 * @return the localized era year string, empty string if date is invalid 0436 */ 0437 QString eraYear() const; 0438 0439 /** 0440 * Returns the Year In Era portion of the date in the current calendar 0441 * system, for example 1 for "1 BC". 0442 * 0443 * See @ref formatting for why you should never display this value. 0444 * 0445 * @see formatDate() 0446 * @see formatYearInEra() 0447 * @return the localized Year In Era number, -1 if date is invalid 0448 */ 0449 int yearInEra() const; 0450 0451 /** 0452 * Returns the day number of year for the date 0453 * 0454 * The days are numbered 1..daysInYear() 0455 * 0456 * See @ref formatting for why you should never display this value. 0457 * 0458 * @see formatDate() 0459 * @return day of year number, -1 if date not valid 0460 */ 0461 int dayOfYear() const; 0462 0463 /** 0464 * Returns the weekday number for the date 0465 * 0466 * The weekdays are numbered 1..7 for Monday..Sunday. 0467 * 0468 * This value is @em not affected by the value of KLocale::weekStartDay() 0469 * 0470 * See @ref formatting for why you should never display this value. 0471 * 0472 * @see formatDate() 0473 * @return day of week number, -1 if date not valid 0474 */ 0475 int dayOfWeek() const; 0476 0477 /** 0478 * Returns the localized Week Number for the date. 0479 * 0480 * See @ref formatting for why you should never display this value. 0481 * 0482 * This may be ISO, US, or any other supported week numbering scheme. If 0483 * you specifically require the ISO Week or any other scheme, you should use 0484 * the week(KLocale::WeekNumberSystem) form. 0485 * 0486 * If the date falls in the last week of the previous year or the first 0487 * week of the following year, then the yearNum returned will be set to the 0488 * appropriate year. 0489 * 0490 * @see weeksInYear() 0491 * @see formatDate() 0492 * @param yearNum returns the year the date belongs to 0493 * @return localized week number, -1 if input date invalid 0494 */ 0495 int week(int *yearNum = nullptr) const; 0496 0497 /** 0498 * Returns the Week Number for the date in the required Week Number System. 0499 * 0500 * See @ref formatting for why you should never display this value. 0501 * 0502 * Unless you want a specific Week Number System (e.g. ISO Week), you should 0503 * use the localized Week Number form of week(). 0504 * 0505 * If the date falls in the last week of the previous year or the first 0506 * week of the following year, then the yearNum returned will be set to the 0507 * appropriate year. 0508 * 0509 * Technically, the ISO Week Number only applies to the ISO/Gregorian Calendar 0510 * System, but the same rules will be applied to the current Calendar System. 0511 * 0512 * @see weeksInYear() 0513 * @see formatDate() 0514 * @param weekNumberSystem the Week Number System to use 0515 * @param yearNum returns the year the date belongs to 0516 * @return week number, -1 if input date invalid 0517 */ 0518 int week(KLocale::WeekNumberSystem weekNumberSystem, int *yearNum = nullptr) const; 0519 0520 /** 0521 * Returns number of months in the year 0522 * 0523 * See @ref formatting for why you should never display this value. 0524 * 0525 * @see formatDate() 0526 * @return number of months in the year, -1 if date invalid 0527 */ 0528 int monthsInYear() const; 0529 0530 /** 0531 * Returns the number of localized weeks in the currently set year. 0532 * 0533 * See @ref formatting for why you should never display this value. 0534 * 0535 * If you specifically require the number of ISO Weeks, you should use 0536 * weeksInYear(KLocale::IsoWeekNumber) 0537 * 0538 * @see week() 0539 * @see formatDate() 0540 * @return number of weeks in the year, -1 if date invalid 0541 */ 0542 int weeksInYear() const; 0543 0544 /** 0545 * Returns the number of Weeks in the currently set year using the required 0546 * Week Number System. 0547 * 0548 * See @ref formatting for why you should never display this value. 0549 * 0550 * Unless you specifically want a particular Week Number System (e.g. ISO Weeks) 0551 * you should use the localized number of weeks provided by weeksInYear(). 0552 * 0553 * @see week() 0554 * @see formatDate() 0555 * @param weekNumberSystem the week number system to use 0556 * @return number of weeks in the year, -1 if date invalid 0557 */ 0558 int weeksInYear(KLocale::WeekNumberSystem weekNumberSystem) const; 0559 0560 /** 0561 * Returns the number of days in the year. 0562 * 0563 * For example, in the Gregorian calendar most years have 365 days but Leap 0564 * Years have 366 years. Other Calendar Systems have different length years. 0565 * 0566 * See @ref formatting for why you should never display this value. 0567 * 0568 * @see formatDate() 0569 * @return number of days in year, -1 if date invalid 0570 */ 0571 int daysInYear() const; 0572 0573 /** 0574 * Returns the number of days in the month. 0575 * 0576 * See @ref formatting for why you should never display this value. 0577 * 0578 * @see formatDate() 0579 * @return number of days in month, -1 if date invalid 0580 */ 0581 int daysInMonth() const; 0582 0583 /** 0584 * Returns the number of days in the week. 0585 * 0586 * See @ref formatting for why you should never display this value. 0587 * 0588 * @see formatDate() 0589 * @return number of days in week, -1 if date invalid 0590 */ 0591 int daysInWeek() const; 0592 0593 /** 0594 * Returns whether the currently set date falls in a Leap Year in the 0595 * current Calendar System. 0596 * 0597 * @return true if the date falls in a leap year 0598 */ 0599 bool isLeapYear() const; 0600 0601 /** 0602 * Returns the Date as a localized string in the requested standard Locale 0603 * format. 0604 * 0605 * See @ref formatting for more details on Date Formatting and valid Locale 0606 * formats. 0607 * 0608 * @see formatDate() 0609 * @param dateFormat the standard date format to use 0610 * @return The date as a localized string 0611 */ 0612 QString formatDate(KLocale::DateFormat dateFormat = KLocale::LongDate) const; 0613 0614 /** 0615 * Returns the Date as a localized string in the requested format. 0616 * 0617 * See @ref formatting for more details on Date Formatting and valid format 0618 * codes. 0619 * 0620 * Please use with care and only in situations where the standard Locale 0621 * formats or the component format methods do not provide what you 0622 * need. You should almost always translate your @p formatString as 0623 * documented above. Using the standard DateFormat options instead would 0624 * take care of the translation for you. 0625 * 0626 * The toFormat parameter is a good candidate to be made translatable, 0627 * so that translators can adapt it to their language's convention. 0628 * There should also be a context using the "kdedt-format" keyword (for 0629 * automatic validation of translations) and stating the format's purpose: 0630 * \code 0631 * QDate reportDate; 0632 * KLocale::global()->calendar()->setDate(reportDate, reportYear, reportMonth, 1); 0633 * dateFormat = i18nc("(kdedt-format) Report month and year in report header", "%B %Y")); 0634 * dateString = KLocale::global()->calendar()->formatDate(reportDate, dateFormat); 0635 * \endcode 0636 * 0637 * The date format string can be defined using either the KDE, POSIX or the Qt 0638 * subset of the UNICODE standards. 0639 * 0640 * The KDE standard closely follows the POSIX standard but with some exceptions. 0641 * Always use the KDE standard within KDE, but where interaction is required with 0642 * external POSIX compliant systems (e.g. Gnome, glibc, etc) the POSIX standard 0643 * should be used. The UNICODE standard is provided for comaptability with QDate 0644 * and so is not yet the full standard, only what Qt currently supports. 0645 * 0646 * Date format strings are made up of date components and string literals. 0647 * Date components are prefixed by a % escape character and are made up of 0648 * optional padding and case modifier flags, an optional width value, and a 0649 * compulsary code for the actual date component: 0650 * %[Flags][Width][Componant] 0651 * e.g. %_^5Y 0652 * No spaces are allowed. 0653 * 0654 * The Flags can modify the padding character and/or case of the Date Componant. 0655 * The Flags are optional and may be combined and/or repeated in any order, 0656 * in which case the last Padding Flag and last Case Flag will be the 0657 * ones used. The Flags must be immediately after the % and before any Width. 0658 * 0659 * The Width can modify how wide the date Componant is padded to. The Width 0660 * is an optional interger value and must be after any Flags but before the 0661 * Componant. If the Width is less than the minimum defined for a Componant 0662 * then the default minimum will be used instead. 0663 * 0664 * By default most numeric Date Componants are right-aligned with leading 0's. 0665 * 0666 * By default all string name fields are capital case and unpadded. 0667 * 0668 * The following Flags may be specified: 0669 * @li - (hyphen) no padding (e.g. 1 Jan and "%-j" = "1") 0670 * @li _ (underscore) pad with spaces (e.g. 1 Jan and "%-j" = " 1") 0671 * @li 0 (zero) pad with 0's (e.g. 1 Jan and "%0j" = "001") 0672 * @li ^ (caret) make uppercase (e.g. 1 Jan and "%^B" = "JANUARY") 0673 * @li # (hash) invert case (e.g. 1 Jan and "%#B" = "???") 0674 * 0675 * The following Date Componants can be specified: 0676 * @li %Y the year to 4 digits (e.g. "1984" for 1984, "0584" for 584, "0084" for 84) 0677 * @li %C the 'century' portion of the year to 2 digits (e.g. "19" for 1984, "05" for 584, "00" for 84) 0678 * @li %y the lower 2 digits of the year to 2 digits (e.g. "84" for 1984, "05" for 2005) 0679 * @li %EY the full local era year (e.g. "2000 AD") 0680 * @li %EC the era name short form (e.g. "AD") 0681 * @li %Ey the year in era to 1 digit (e.g. 1 or 2000) 0682 * @li %m the month number to 2 digits (January="01", December="12") 0683 * @li %n the month number to 1 digit (January="1", December="12"), see notes! 0684 * @li %d the day number of the month to 2 digits (e.g. "01" on the first of March) 0685 * @li %e the day number of the month to 1 digit (e.g. "1" on the first of March) 0686 * @li %B the month name long form (e.g. "January") 0687 * @li %b the month name short form (e.g. "Jan" for January) 0688 * @li %h the month name short form (e.g. "Jan" for January) 0689 * @li %A the weekday name long form (e.g. "Wednesday" for Wednesday) 0690 * @li %a the weekday name short form (e.g. "Wed" for Wednesday) 0691 * @li %j the day of the year number to 3 digits (e.g. "001" for 1 Jan) 0692 * @li %V the ISO week of the year number to 2 digits (e.g. "01" for ISO Week 1) 0693 * @li %G the year number in long form of the ISO week of the year to 4 digits (e.g. "2004" for 1 Jan 2005) 0694 * @li %g the year number in short form of the ISO week of the year to 2 digits (e.g. "04" for 1 Jan 2005) 0695 * @li %u the day of the week number to 1 digit (e.g. "1" for Monday) 0696 * @li %D the US short date format (e.g. "%m/%d/%y") 0697 * @li %F the ISO short date format (e.g. "%Y-%m-%d") 0698 * @li %x the KDE locale short date format 0699 * @li %% the literal "%" 0700 * @li %t a tab character 0701 * 0702 * Everything else in the format string will be taken as literal text. 0703 * 0704 * Examples: 0705 * "%Y-%m-%d" = "2009-01-01" 0706 * "%Y-%-m-%_4d" = "2009-1- 1" 0707 * 0708 * The following format codes behave differently in the KDE and POSIX standards 0709 * @li %e in GNU/POSIX is space padded to 2 digits, in KDE is not padded 0710 * @li %n in GNU/POSIX is newline, in KDE is short month number 0711 * 0712 * The following POSIX format codes are currently not supported: 0713 * @li %U US week number 0714 * @li %w US day of week 0715 * @li %W US week number 0716 * @li %O locale's alternative numeric symbols, in KDE is not supported 0717 * 0718 * %0 is not supported as the returned result is always in the locale's chosen numeric symbol digit set. 0719 * 0720 * @see formatDate() 0721 * @param formatString the date format to use 0722 * @param formatStandard the standard the @p dateFormat uses, defaults to KDE Standard 0723 * @return The date as a localized string 0724 */ 0725 QString formatDate(const QString &formatString, 0726 KLocale::DateTimeFormatStandard formatStandard = KLocale::KdeFormat) const; 0727 0728 /** 0729 * Returns a Date Component as a localized string in the requested format. 0730 * 0731 * See @ref formatting for more details on Date Formatting. 0732 * 0733 * Each format size may vary depending on Locale and Calendar System but will 0734 * generally match the format description. Some formats may not be directly 0735 * valid but a sensible value will always be returned. 0736 * 0737 * For example for 2010-01-01 the KLocale::Month with en_US Locale and Gregorian calendar may return: 0738 * KLocale::ShortNumber = "1" 0739 * KLocale::LongNumber = "01" 0740 * KLocale::NarrowName = "J" 0741 * KLocale::ShortName = "Jan" 0742 * KLocale::LongName = "January" 0743 * 0744 * @see formatDate() 0745 * @param component The date component to return 0746 * @param format The format to return the @p component in 0747 * @param weekNumberSystem To override the default Week Number System to use 0748 * @return The string form of the date component 0749 */ 0750 QString formatDate(KLocale::DateTimeComponent component, 0751 KLocale::DateTimeComponentFormat format = KLocale::DefaultComponentFormat, 0752 KLocale::WeekNumberSystem weekNumberSystem = KLocale::DefaultWeekNumber) const; 0753 0754 /** 0755 * Converts a localized date string to a KLocalizedDate using either the 0756 * Global Calendar System and Locale, or the provided Calendar System. 0757 * 0758 * See @ref parsing for more details on Date Parsing from strings. 0759 * 0760 * This method is more liberal and will return a valid date if the 0761 * @p dateString matches any of the KLocale::ReadDateFlags formats 0762 * for the Locale. 0763 * 0764 * If you require a certain KLocale::ReadDateFlags format or a customized 0765 * format string, use one of the other readDate() methods. 0766 * 0767 * @param dateString the string to parse 0768 * @param parseMode how strictly to apply the locale formats to the @p dateString 0769 * @param calendar the Calendar System to use when parsing the date 0770 * @return the localized date parsed from the string 0771 */ 0772 static KLocalizedDate readDate(const QString &dateString, 0773 KLocale::DateTimeParseMode parseMode = KLocale::LiberalParsing, 0774 const KCalendarSystem *calendar = nullptr); 0775 0776 /** 0777 * Converts a localized date string to a KLocalizedDate using either the 0778 * Global Calendar System and Locale, or the provided Calendar System. 0779 * 0780 * See @ref parsing for more details on Date Parsing from strings. 0781 * 0782 * This method is stricter and will return a valid date only if the 0783 * @p dateString matches one of the @p dateFlags formats requested. 0784 * 0785 * If you require any KLocale::ReadDateFlags format or a customized format 0786 * string, use one of the other readDate() methods. 0787 * 0788 * @param dateString the string to parse 0789 * @param formatFlags the locale format(s) to try parse the string with 0790 * @param parseMode how strictly to apply the @p formatFlags to the @p dateString 0791 * @param calendar the Calendar System to use when parsing the date 0792 * @return the localized date parsed from the string 0793 */ 0794 static KLocalizedDate readDate(const QString &dateString, 0795 KLocale::ReadDateFlags formatFlags, 0796 KLocale::DateTimeParseMode parseMode = KLocale::LiberalParsing, 0797 const KCalendarSystem *calendar = nullptr); 0798 0799 /** 0800 * Converts a localized date string to a KLocalizedDate using either the 0801 * Global Calendar System and Locale, or the provided Calendar System. 0802 * 0803 * See @ref parsing for more details on Date Parsing from strings. 0804 * 0805 * This method allows you to define your own date format to parse the date 0806 * string with. 0807 * 0808 * If you require one of the standard any KLocale::ReadDateFlags formats 0809 * then use one of the other readDate() methods. 0810 * 0811 * @param dateString the string to parse 0812 * @param dateFormat the date format to try parse the string with 0813 * @param parseMode how strictly to apply the @p dateFormat to the @p dateString 0814 * @param formatStandard the standard the @p dateFormat format uses 0815 * @param calendar the Calendar System to use when parsing the date 0816 * @return the localized date parsed from the string 0817 */ 0818 static KLocalizedDate readDate(const QString &dateString, 0819 const QString &dateFormat, 0820 KLocale::DateTimeParseMode parseMode = KLocale::LiberalParsing, 0821 KLocale::DateTimeFormatStandard formatStandard = KLocale::KdeFormat, 0822 const KCalendarSystem *calendar = nullptr); 0823 0824 /** 0825 * Returns a KLocalizedDate containing a date @p years years later. 0826 * 0827 * @see addYearsTo() 0828 * @see addMonths() addDays() 0829 * @see dateDifference() yearsDifference() 0830 * @param years The number of years to add 0831 * @return The new date, null date if any errors 0832 */ 0833 KLocalizedDate addYears(int years) const; 0834 0835 /** 0836 * Add years onto this date instance. 0837 * 0838 * If the result of the addition is invalid in the current Calendar System 0839 * then the date will become invalid. 0840 * 0841 * @see addYears() 0842 * @see addMonthsTo() addDaysTo() 0843 * @see dateDifference() yearsDifference() 0844 * @param years The number of years to add 0845 * @return if the resulting date is valid 0846 */ 0847 bool addYearsTo(int years); 0848 0849 /** 0850 * Returns a KLocalizedDate containing a date @p months months later. 0851 * 0852 * @see addMonthsTo() 0853 * @see addYears() addDays() 0854 * @see dateDifference() yearsDifference() 0855 * @param months number of months to add 0856 * @return The new date, null date if any errors 0857 */ 0858 KLocalizedDate addMonths(int months) const; 0859 0860 /** 0861 * Add months onto this date instance. 0862 * 0863 * If the result of the addition is invalid in the current Calendar System 0864 * then the date will become invalid. 0865 * 0866 * @see addMonths() 0867 * @see addYearsTo() addDaysTo() 0868 * @see dateDifference() yearsDifference() 0869 * @param months The number of months to add 0870 * @return if the resulting date is valid 0871 */ 0872 bool addMonthsTo(int months); 0873 0874 /** 0875 * Returns a KLocalizedDate containing a date @p days days later. 0876 * 0877 * @see addDaysTo() 0878 * @see addYears() addMonths() 0879 * @see dateDifference() yearsDifference() 0880 * @param days number of days to add 0881 * @return The new date, null date if any errors 0882 */ 0883 KLocalizedDate addDays(int days) const; 0884 0885 /** 0886 * Add days onto this date instance. 0887 * 0888 * If the result of the addition is invalid in the current Calendar System 0889 * then the date will become invalid. 0890 * 0891 * @see addDays() 0892 * @see addYearsTo(), addMonthsTo() 0893 * @see dateDifference() yearsDifference() 0894 * @param days The number of days to add 0895 * @return if the resulting date is valid 0896 */ 0897 bool addDaysTo(int days); 0898 0899 /** 0900 * Returns the difference between this and another date in years, months and days 0901 * in the current Calendar System. 0902 * 0903 * The difference is always calculated from the earlier date to the later 0904 * date in year, month and day order, with the @p direction parameter 0905 * indicating which direction the difference is applied from this date. 0906 * In other words, this difference can be added onto the earlier date in 0907 * year, month, day order to reach the later date. 0908 * 0909 * For example, the difference between 2010-06-10 and 2012-09-5 is 2 years, 0910 * 2 months and 26 days. Note that the difference between two last days of 0911 * the month is always 1 month, e.g. 2010-01-31 to 2010-02-28 is 1 month 0912 * not 28 days. 0913 * 0914 * @see addYears() addMonths() addDays() 0915 * @see yearsDifference() monthsDifference() daysDifference() 0916 * @param toDate The date to end at 0917 * @param yearsDiff Returns number of years difference 0918 * @param monthsDiff Returns number of months difference 0919 * @param daysDiff Returns number of days difference 0920 * @param direction Returns direction of difference, 1 if this Date <= toDate, -1 otherwise 0921 */ 0922 void dateDifference(const KLocalizedDate &toDate, 0923 int *yearsDiff, int *monthsDiff, int *daysDiff, int *direction) const; 0924 0925 /** 0926 * Returns the difference between this and another date in years, months and days 0927 * in the current Calendar System. 0928 * 0929 * The difference is always calculated from the earlier date to the later 0930 * date in year, month and day order, with the @p direction parameter 0931 * indicating which direction the difference is applied from this date. 0932 * In other words, this difference can be added onto the earlier date in 0933 * year, month, day order to reach the later date. 0934 * 0935 * For example, the difference between 2010-06-10 and 2012-09-5 is 2 years, 0936 * 2 months and 26 days. Note that the difference between two last days of 0937 * the month is always 1 month, e.g. 2010-01-31 to 2010-02-28 is 1 month 0938 * not 28 days. 0939 * 0940 * @see addYears() addMonths() addDays() 0941 * @see yearsDifference() monthsDifference() daysDifference() 0942 * @param toDate The date to end at 0943 * @param yearsDiff Returns number of years difference 0944 * @param monthsDiff Returns number of months difference 0945 * @param daysDiff Returns number of days difference 0946 * @param direction Returns direction of difference, 1 if this Date <= toDate, -1 otherwise 0947 */ 0948 void dateDifference(const QDate &toDate, 0949 int *yearsDiff, int *monthsDiff, int *daysDiff, int *direction) const; 0950 0951 /** 0952 * Returns the difference between this and another date in completed calendar years 0953 * in the current Calendar System. 0954 * 0955 * The returned value will be negative if @p toDate < this date. 0956 * 0957 * For example, the difference between 2010-06-10 and 2012-09-5 is 2 years. 0958 * 0959 * @see addYears() 0960 * @see dateDifference() monthsDifference() daysDifference() 0961 * @param toDate The date to end at 0962 * @return The number of years difference 0963 */ 0964 int yearsDifference(const KLocalizedDate &toDate) const; 0965 0966 /** 0967 * Returns the difference between this and another date in completed calendar years 0968 * in the current Calendar System. 0969 * 0970 * The returned value will be negative if @p toDate < this date. 0971 * 0972 * For example, the difference between 2010-06-10 and 2012-09-5 is 2 years. 0973 * 0974 * @see addYears() 0975 * @see dateDifference() monthsDifference() daysDifference() 0976 * @param toDate The date to end at 0977 * @return The number of years difference 0978 */ 0979 int yearsDifference(const QDate &toDate) const; 0980 0981 /** 0982 * Returns the difference between this and another date in completed calendar months 0983 * in the current Calendar System. 0984 * 0985 * The returned value will be negative if @p toDate < this date. 0986 * 0987 * For example, the difference between 2010-06-10 and 2012-09-5 is 26 months. 0988 * Note that the difference between two last days of the month is always 1 0989 * month, e.g. 2010-01-31 to 2010-02-28 is 1 month not 28 days. 0990 * 0991 * @see addMonths() 0992 * @see dateDifference() yearsDifference() daysDifference() 0993 * @param toDate The date to end at 0994 * @return The number of months difference 0995 */ 0996 int monthsDifference(const KLocalizedDate &toDate) const; 0997 0998 /** 0999 * Returns the difference between this and another date in completed calendar months 1000 * in the current Calendar System. 1001 * 1002 * The returned value will be negative if @p toDate < this date. 1003 * 1004 * For example, the difference between 2010-06-10 and 2012-09-5 is 26 months. 1005 * Note that the difference between two last days of the month is always 1 1006 * month, e.g. 2010-01-31 to 2010-02-28 is 1 month not 28 days. 1007 * 1008 * @see addMonths() 1009 * @see dateDifference() yearsDifference() daysDifference() 1010 * @param toDate The date to end at 1011 * @return The number of months difference 1012 */ 1013 int monthsDifference(const QDate &toDate) const; 1014 1015 /** 1016 * Returns the difference between this and another date in days 1017 * The returned value will be negative if @p toDate < this date. 1018 * 1019 * @see addDays() 1020 * @see dateDifference() yearsDifference() monthsDifference() 1021 * @param toDate The date to end at 1022 * @return The number of days difference 1023 */ 1024 int daysDifference(const KLocalizedDate &toDate) const; 1025 1026 /** 1027 * Returns the difference between this and another date in days 1028 * The returned value will be negative if @p toDate < this date. 1029 * 1030 * @see addDays() 1031 * @see dateDifference() yearsDifference() monthsDifference() 1032 * @param toDate The date to end at 1033 * @return The number of days difference 1034 */ 1035 int daysDifference(const QDate &toDate) const; 1036 1037 /** 1038 * Returns a KLocalizedDate containing the first day of the currently set year 1039 * 1040 * @see lastDayOfYear() 1041 * @return The first day of the year 1042 */ 1043 KLocalizedDate firstDayOfYear() const; 1044 1045 /** 1046 * Returns a KLocalizedDate containing the last day of the currently set year 1047 * 1048 * @see firstDayOfYear() 1049 * @return The last day of the year 1050 */ 1051 KLocalizedDate lastDayOfYear() const; 1052 1053 /** 1054 * Returns a KLocalizedDate containing the first day of the currently set month 1055 * 1056 * @see lastDayOfMonth() 1057 * @return The first day of the month 1058 */ 1059 KLocalizedDate firstDayOfMonth() const; 1060 1061 /** 1062 * Returns a KLocalizedDate containing the last day of the currently set month 1063 * 1064 * @see firstDayOfMonth() 1065 * @return The last day of the month 1066 */ 1067 KLocalizedDate lastDayOfMonth() const; 1068 1069 /** 1070 * KLocalizedDate equality operator 1071 * 1072 * @param other the date to compare 1073 */ 1074 bool operator==(const KLocalizedDate &other) const; 1075 1076 /** 1077 * QDate equality operator 1078 * 1079 * @param other the date to compare 1080 */ 1081 bool operator==(const QDate &other) const; 1082 1083 /** 1084 * KLocalizedDate inequality operator 1085 * 1086 * @param other the date to compare 1087 */ 1088 bool operator!=(const KLocalizedDate &other) const; 1089 1090 /** 1091 * QDate inequality operator 1092 * 1093 * @param other the date to compare 1094 */ 1095 bool operator!=(const QDate &other) const; 1096 1097 /** 1098 * KLocalizedDate less than operator 1099 * 1100 * @param other the date to compare 1101 */ 1102 bool operator<(const KLocalizedDate &other) const; 1103 1104 /** 1105 * QDate less than operator 1106 * 1107 * @param other the date to compare 1108 */ 1109 bool operator<(const QDate &other) const; 1110 1111 /** 1112 * KLocalizedDate less than or equal to operator 1113 * 1114 * @param other the date to compare 1115 */ 1116 bool operator<=(const KLocalizedDate &other) const; 1117 1118 /** 1119 * QDate less than or equal to operator 1120 * 1121 * @param other the date to compare 1122 */ 1123 bool operator<=(const QDate &other) const; 1124 1125 /** 1126 * KLocalizedDate greater than operator 1127 * 1128 * @param other the date to compare 1129 */ 1130 bool operator>(const KLocalizedDate &other) const; 1131 1132 /** 1133 * QDate greater than operator 1134 * 1135 * @param other the date to compare 1136 */ 1137 bool operator>(const QDate &other) const; 1138 1139 /** 1140 * KLocalizedDate greater than or equal to operator 1141 * 1142 * @param other the date to compare 1143 */ 1144 bool operator>=(const KLocalizedDate &other) const; 1145 1146 /** 1147 * QDate greater than or equal to operator 1148 * 1149 * @param other the date to compare 1150 */ 1151 bool operator>=(const QDate &other) const; 1152 1153 private: 1154 1155 friend QDataStream KDELIBS4SUPPORT_EXPORT &operator<<(QDataStream &out, const KLocalizedDate &date); 1156 friend QDataStream KDELIBS4SUPPORT_EXPORT &operator>>(QDataStream &in, KLocalizedDate &date); 1157 friend QDebug KDELIBS4SUPPORT_EXPORT operator<<(QDebug, const KLocalizedDate &); 1158 1159 QSharedDataPointer<KLocalizedDatePrivate> d; 1160 }; 1161 1162 Q_DECLARE_METATYPE(KLocalizedDate) 1163 1164 /** 1165 * Data stream output operator 1166 * 1167 * @param out the datastream to write to 1168 * @param date the date to write to the stream 1169 */ 1170 QDataStream KDELIBS4SUPPORT_EXPORT &operator<<(QDataStream &out, const KLocalizedDate &date); 1171 1172 /** 1173 * Data stream input operator 1174 * 1175 * @param in the datastream to read from 1176 * @param date the date to read from the stream 1177 */ 1178 QDataStream KDELIBS4SUPPORT_EXPORT &operator>>(QDataStream &in, KLocalizedDate &date); 1179 1180 /** 1181 * Debug stream output operator 1182 * 1183 * @param debug the debug datastream to write to 1184 * @param date the date to write to the stream 1185 */ 1186 QDebug KDELIBS4SUPPORT_EXPORT operator<<(QDebug debug, const KLocalizedDate &date); 1187 1188 #endif // KLOCALIZEDDATE_H