kdelibs/kdecore/date/klocalizeddate.h

1189 lines
42 KiB
C++

/*
Copyright 2010 John Layt <john@layt.net>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef KLOCALIZEDDATE_H
#define KLOCALIZEDDATE_H
#include <QtCore/QString>
#include <QtCore/qdatetime.h>
#include <kdecore_export.h>
#include "kcalendarsystem.h"
#include "klocale.h"
class KLocalizedDatePrivate;
/**
* @short A class representing a date localized using the local calendar system, language and formats
*
* Topics:
* - @ref intro
* - @ref calsys
* - @ref custom
* - @ref formatting
* - @ref maths
*
* @section intro Introduction
*
* This class provides a simple and convenient way to localize dates
*
* @section calsys Calendar System
*
* KDE supports the use of different calendar systems.
*
* @section custom Default and Custom Locale and Calendar System
*
* In most cases you will want to use the default Global Locale and Calendar
* System, in which case you need only create a default KLocalizedDate. If
* however you specifically need a different Calendar System or Locale settings
* then you need to take some extra steps.
*
* The simplest method is just changing the Calendar System while keeping the
* current Locale settings. This is easily done using setCalendarSystem()
* which will copy the current Locale being used and apply this to the new
* Calendar System. Note this means any changes to the old locale settings,
* either the Global Locale or a custom Locale (see below) will not apply
* to that date instance.
*
* You may however wish to use a custom Locale with the Calendar System.
* For example, if you want your app to normally show dates using the Global
* Locale and Calendar System, but wish to show an info box with the Islamic
* date in Arabic language and format, then you need a custom Locale to do
* this.
*
* \code
* KLocale *myLocale = new KLocale("myapp", "ar", "eg");
* KCalendarSystem *myCalendar = KCalendarSystem::create(KLocale::IslamicCivilCalendar, myLocale);
* KLocalizedDate myDate(QDate(2010,1,1), myCalendar);
* \endcode
*
* In this case you are responsible for the memory management of the KLocale
* and KCalendarSystem. This allows you to reuse this calendar across multiple
* date instances without it being deleted under you. It also allows you to
* change any setting in the Locale and have it apply across all those date
* instances. @warning Don't try changing the Calendar System via your Locale
* instance, your KCalendarSystem instance will be deleted and all the dates
* will be invalid!
*
* @see
*
* @section formatting Date Formatting
*
* When you display dates or date components to users in a GUI, they will
* expect them to be displayed in their language and digit set following their
* local date formatting conventions. Directly displaying values returned by
* the normal date component methods such as day() will not conform to these
* expectations, so you need to use different methods to obtain the localized
* string form of the date or component.
*
* You can either format the entire date, or just a single component of the
* date such as the month or day.
*
* When formatting a full date, it is preferred to use one of the standard date
* formats defined in the Locale, although you can provide your own format in
* either the KDE, POSIX, or UNICODE standards.
*
* @see formatDate() formatDate()
*
* @section parsing Date Parsing
*
* Basic concepts on date parsing, then full details on KLocale::ReadDateFlags
* formats, definging your own date format strings, and setting how strictly
* the format is appplied.
*
* You can choose how strictly a date format is applied in parsing. Currently
* only liberal Parsing is supported.
*
* The KLocale::LiberalParsing mode applies the following rules:
*
* 1) You must supply a format and string containing at least one of the following combinations to
* create a valid date:
* @li a month and day of month
* @li a day of year
* @li a ISO week number and day of week
*
* 2) If a year number is not supplied then the current year will be assumed.
*
* 3) All date components must be separated by a non-numeric character.
*
* 4) The format is not applied strictly to the input string:
* @li extra whitespace is ignored
* @li leading 0's on numbers are ignored
* @li capitalisation of literals is ignored
*
* @see readDate()
*
* @section maths Date Maths
*
* A full set of date maths functions are provided which operate in a consistent
* manner, i.e. you can safely round-trip.
*
*/
class KDECORE_EXPORT KLocalizedDate
{
public:
/**
* Constructs a localized date with the given date.
*
* By default, uses the global Calendar System and Locale.
*
* If you pass in a custom Calendar System then you retain ownership of it
* and are responsible for deleting it. This allows you to reuse the same
* custom Calendar System for many localized date instances.
*
* See @ref custom for more details on using custom Calendar Systems.
*
* @param date the QDate to set the KLocalizedDate to, defaults to invalid date
* @param calendar the calendar system to use, defaults to the global
*/
explicit KLocalizedDate(const QDate &date = QDate(), const KCalendarSystem *calendar = 0);
/**
* Constructs a localized date with the given year, month and day.
*
* By default, uses the global Calendar System and Locale.
*
* If you pass in a custom Calendar System then you retain ownership of it
* and are responsible for deleting it. This allows you to reuse the same
* custom Calendar System for many localized date instances.
*
* See @ref custom for more details on using custom Calendar Systems.
*
* @param year the year to set the KLocalizedDate to
* @param month the month to set the KLocalizedDate to
* @param day the day to set the KLocalizedDate to
* @param calendar the calendar system to use, defaults to the global
*/
KLocalizedDate(int year, int month, int day, const KCalendarSystem *calendar = 0);
/**
* Copy constructor
*
* @param rhs the date to copy
*/
KLocalizedDate(const KLocalizedDate &rhs);
/**
* Assignment operator
*
* @param rhs the date to assign
*/
KLocalizedDate &operator=(const KLocalizedDate &rhs);
/**
* Assignment operator
*
* @param rhs the date to assign
*/
KLocalizedDate &operator=(const QDate &rhs);
/**
* Destructor.
*/
~KLocalizedDate();
/**
* Set the Calendar System used for this date instance only.
*
* This method is mostly useful for when you quickly want to see what the
* currently set date would look like in a different Calendar System but
* using the same Locale.
*
* When the Calendar System is changed, a copy will be taken of the Locale
* previously used and this copy will be applied to the new Calendar System.
* Any changes to the old Locale settings, either the Global or a Custom
* Locale, will not be applied to this date instance.
*
* See @ref custom for more details on using custom Calendar Systems.
*
* @see KLocale::CalendarSystem
* @see calendarSystem()
* @param calendarSystem the Calendar System to use
*/
void setCalendarSystem(KLocale::CalendarSystem calendarSystem);
/**
* Returns the Calendar System used by this localized date instance
*
* @see KLocale::CalendarSystem
* @see setCalendarSystem()
* @return the Calendar System currently used
*/
KLocale::CalendarSystem calendarSystem();
/**
* Returns a pointer to the Calendar System object used by this date instance.
*
* Usually this will be the Global Calendar System, but this may have been
* changed.
*
* Normally you will not need to access this object unless the KLocalizedDate
* API does not provide the methods you require.
*
* @see KCalendarSystem
* @see calendarSystem
* @see setCalendarSystem
* @return the current calendar system instance
*/
const KCalendarSystem *calendar() const;
/**
* Returns whether the date is null, i.e. invalid in any Calendar System.
*
* @see isValid
* @return @c true if the date is null, @c false otherwise
*/
bool isNull() const;
/**
* Returns whether the date is valid in the current Calendar System.
*
* @see isNull
* @return @c true if the date is valid, @c false otherwise
*/
bool isValid() const;
/**
* Set the date using a QDate.
*
* @param date the QDate to set to
* @return @c true if the date is valid, @c false otherwise
*/
bool setDate(const QDate &date);
/**
* Set the date's year, month and day.
*
* The range of the year, month and day, and the validity of the date as a
* whole depends on which Calendar System is being used.
*
* @see getDate()
* @param year year number
* @param month month of year number
* @param day day of month
* @return @c true if the date is valid, @c false otherwise
*/
bool setDate(int year, int month, int day);
/**
* Set the date using the year number and day of year number only.
*
* @see dayOfYear()
* @param year year
* @param dayOfYear day of year
* @return @c true if the date is valid, @c false otherwise
*/
bool setDate(int year, int dayOfYear);
/**
* Set the date using the era, year in era number, month and day
*
* @see eraName()
* @see yearInEra()
* @param eraName Era string
* @param yearInEra Year In Era number
* @param month Month number
* @param day Day Of Month number
* @return @c true if the date is valid, @c false otherwise
*/
bool setDate(QString eraName, int yearInEra, int month, int day);
/**
* Set the date using the year, week and day of week.
*
* Currently only the ISO Week Number System is supported.
*
* @see week()
* @see dayOfWeek()
* @param weekNumberSystem the week number system to use
* @param year year
* @param weekOfYear week of year
* @param dayOfWeek day of week Mon..Sun (1..7)
* @return @c true if the date is valid, @c false otherwise
*/
bool setDate(KLocale::WeekNumberSystem weekNumberSystem, int year, int weekOfYear, int dayOfWeek);
/**
* Set the date to today's date
*
* @see currentDate()
* @return @c true if the date is valid, @c false otherwise
*/
bool setCurrentDate();
/**
* Returns a KLocalizedDate set to today's date in the Global Locale and
* Calendar System.
*
* @see setCurrentDate()
* @return today's localized date
*/
static KLocalizedDate currentDate();
/**
* Returns a KLocalizedDate set the required date in the Global Locale and
* Calendar System.
*
* @param date the date to set to
* @return a localized date
*/
static KLocalizedDate fromDate(const QDate &date);
/**
* Returns a KLocalizedDate set the required Julian Day number in the Global
* Locale and Calendar System.
*
* @see toJulianDay()
* @param jd the Julian Day number to set to
* @return a localized date
*/
static KLocalizedDate fromJulianDay(int jd);
/**
* Returns the currently set date as a Julian Day number
*
* @see fromJulianDay()
* @return the currently set date as a Julian Day number
*/
int toJulianDay() const;
/**
* Returns the currently set date as a QDate
*
* @return the currently set date as a QDate
*/
QDate date() const;
/**
* Returns the year, month and day portion of the date in the current
* Calendar System.
*
* See @ref formatting for why you should never display this value.
*
* @see setDate()
* @see formatDate()
* @param year year number returned in this variable
* @param month month number returned in this variable
* @param day day of month returned in this variable
*/
void getDate(int *year, int *month, int *day) const;
/**
* Returns the year portion of the date in the current calendar system
*
* See @ref formatting for why you should never display this value.
*
* @see formatDate()
* @return the localized year number
*/
int year() const;
/**
* Returns the month portion of the date in the current calendar system
*
* See @ref formatting for why you should never display this value.
*
* @see formatDate()
* @return the localized month number, 0 if date is invalid
*/
int month() const;
/**
* Returns the day portion of the date in the current calendar system
*
* See @ref formatting for why you should never display this value.
*
* @see formatDate()
* @return the localized day number, 0 if date is invalid
*/
int day() const;
/**
* Returns the Era Name portion of the date in the current calendar system,
* for example "AD" or "Anno Domini" for the Gregorian calendar and Christian Era.
*
* See @ref formatting for more details on Date Formatting.
*
* @see formatDate()
* @return the localized era name, empty string if date is invalid
*/
QString eraName() const;
/**
* Returns the Era Year portion of the date in the current
* calendar system, for example "2000 AD" or "Heisei 22".
*
* See @ref formatting for more details on Date Formatting.
*
* @see formatDate()
* @return the localized era year string, empty string if date is invalid
*/
QString eraYear() const;
/**
* Returns the Year In Era portion of the date in the current calendar
* system, for example 1 for "1 BC".
*
* See @ref formatting for why you should never display this value.
*
* @see formatDate()
* @see formatYearInEra()
* @return the localized Year In Era number, -1 if date is invalid
*/
int yearInEra() const;
/**
* Returns the day number of year for the date
*
* The days are numbered 1..daysInYear()
*
* See @ref formatting for why you should never display this value.
*
* @see formatDate()
* @return day of year number, -1 if date not valid
*/
int dayOfYear() const;
/**
* Returns the weekday number for the date
*
* The weekdays are numbered 1..7 for Monday..Sunday.
*
* This value is @em not affected by the value of KLocale::weekStartDay()
*
* See @ref formatting for why you should never display this value.
*
* @see formatDate()
* @return day of week number, -1 if date not valid
*/
int dayOfWeek() const;
/**
* Returns the localized Week Number for the date.
*
* See @ref formatting for why you should never display this value.
*
* This may be ISO, US, or any other supported week numbering scheme. If
* you specifically require the ISO Week or any other scheme, you should use
* the week(KLocale::WeekNumberSystem) form.
*
* If the date falls in the last week of the previous year or the first
* week of the following year, then the yearNum returned will be set to the
* appropriate year.
*
* @see weeksInYear()
* @see formatDate()
* @param yearNum returns the year the date belongs to
* @return localized week number, -1 if input date invalid
*/
int week(int *yearNum = 0) const;
/**
* Returns the Week Number for the date in the required Week Number System.
*
* See @ref formatting for why you should never display this value.
*
* Unless you want a specific Week Number System (e.g. ISO Week), you should
* use the localized Week Number form of week().
*
* If the date falls in the last week of the previous year or the first
* week of the following year, then the yearNum returned will be set to the
* appropriate year.
*
* Technically, the ISO Week Number only applies to the ISO/Gregorian Calendar
* System, but the same rules will be applied to the current Calendar System.
*
* @see weeksInYear()
* @see formatDate()
* @param weekNumberSystem the Week Number System to use
* @param yearNum returns the year the date belongs to
* @return week number, -1 if input date invalid
*/
int week(KLocale::WeekNumberSystem weekNumberSystem, int *yearNum = 0) const;
/**
* Returns number of months in the year
*
* See @ref formatting for why you should never display this value.
*
* @see formatDate()
* @return number of months in the year, -1 if date invalid
*/
int monthsInYear() const;
/**
* Returns the number of localized weeks in the currently set year.
*
* See @ref formatting for why you should never display this value.
*
* If you specifically require the number of ISO Weeks, you should use
* weeksInYear(KLocale::IsoWeekNumber)
*
* @see week()
* @see formatDate()
* @return number of weeks in the year, -1 if date invalid
*/
int weeksInYear() const;
/**
* Returns the number of Weeks in the currently set year using the required
* Week Number System.
*
* See @ref formatting for why you should never display this value.
*
* Unless you specifically want a particular Week Number System (e.g. ISO Weeks)
* you should use the localized number of weeks provided by weeksInYear().
*
* @see week()
* @see formatDate()
* @param weekNumberSystem the week number system to use
* @return number of weeks in the year, -1 if date invalid
*/
int weeksInYear(KLocale::WeekNumberSystem weekNumberSystem) const;
/**
* Returns the number of days in the year.
*
* For example, in the Gregorian calendar most years have 365 days but Leap
* Years have 366 years. Other Calendar Systems have different length years.
*
* See @ref formatting for why you should never display this value.
*
* @see formatDate()
* @return number of days in year, -1 if date invalid
*/
int daysInYear() const;
/**
* Returns the number of days in the month.
*
* See @ref formatting for why you should never display this value.
*
* @see formatDate()
* @return number of days in month, -1 if date invalid
*/
int daysInMonth() const;
/**
* Returns the number of days in the week.
*
* See @ref formatting for why you should never display this value.
*
* @see formatDate()
* @return number of days in week, -1 if date invalid
*/
int daysInWeek() const;
/**
* Returns whether the currently set date falls in a Leap Year in the
* current Calendar System.
*
* @return true if the date falls in a leap year
*/
bool isLeapYear() const;
/**
* Returns the Date as a localized string in the requested standard Locale
* format.
*
* See @ref formatting for more details on Date Formatting and valid Locale
* formats.
*
* @see formatDate()
* @param dateFormat the standard date format to use
* @return The date as a localized string
*/
QString formatDate(KLocale::DateFormat dateFormat = KLocale::LongDate) const;
/**
* Returns the Date as a localized string in the requested format.
*
* See @ref formatting for more details on Date Formatting and valid format
* codes.
*
* Please use with care and only in situations where the standard Locale
* formats or the component format methods do not provide what you
* need. You should almost always translate your @p formatString as
* documented above. Using the standard DateFormat options instead would
* take care of the translation for you.
*
* The toFormat parameter is a good candidate to be made translatable,
* so that translators can adapt it to their language's convention.
* There should also be a context using the "kdedt-format" keyword (for
* automatic validation of translations) and stating the format's purpose:
* \code
* QDate reportDate;
* KGlobal::locale()->calendar()->setDate(reportDate, reportYear, reportMonth, 1);
* dateFormat = i18nc("(kdedt-format) Report month and year in report header", "%B %Y"));
* dateString = KGlobal::locale()->calendar()->formatDate(reportDate, dateFormat);
* \endcode
*
* The date format string can be defined using either the KDE, POSIX or the Qt
* subset of the UNICODE standards.
*
* The KDE standard closely follows the POSIX standard but with some exceptions.
* Always use the KDE standard within KDE, but where interaction is required with
* external POSIX compliant systems (e.g. Gnome, glibc, etc) the POSIX standard
* should be used. The UNICODE standard is provided for comaptability with QDate
* and so is not yet the full standard, only what Qt currently supports.
*
* Date format strings are made up of date components and string literals.
* Date components are prefixed by a % escape character and are made up of
* optional padding and case modifier flags, an optional width value, and a
* compulsary code for the actual date component:
* %[Flags][Width][Componant]
* e.g. %_^5Y
* No spaces are allowed.
*
* The Flags can modify the padding character and/or case of the Date Componant.
* The Flags are optional and may be combined and/or repeated in any order,
* in which case the last Padding Flag and last Case Flag will be the
* ones used. The Flags must be immediately after the % and before any Width.
*
* The Width can modify how wide the date Componant is padded to. The Width
* is an optional interger value and must be after any Flags but before the
* Componant. If the Width is less than the minimum defined for a Componant
* then the default minimum will be used instead.
*
* By default most numeric Date Componants are right-aligned with leading 0's.
*
* By default all string name fields are capital case and unpadded.
*
* The following Flags may be specified:
* @li - (hyphen) no padding (e.g. 1 Jan and "%-j" = "1")
* @li _ (underscore) pad with spaces (e.g. 1 Jan and "%-j" = " 1")
* @li 0 (zero) pad with 0's (e.g. 1 Jan and "%0j" = "001")
* @li ^ (caret) make uppercase (e.g. 1 Jan and "%^B" = "JANUARY")
* @li # (hash) invert case (e.g. 1 Jan and "%#B" = "???")
*
* The following Date Componants can be specified:
* @li %Y the year to 4 digits (e.g. "1984" for 1984, "0584" for 584, "0084" for 84)
* @li %C the 'century' portion of the year to 2 digits (e.g. "19" for 1984, "05" for 584, "00" for 84)
* @li %y the lower 2 digits of the year to 2 digits (e.g. "84" for 1984, "05" for 2005)
* @li %EY the full local era year (e.g. "2000 AD")
* @li %EC the era name short form (e.g. "AD")
* @li %Ey the year in era to 1 digit (e.g. 1 or 2000)
* @li %m the month number to 2 digits (January="01", December="12")
* @li %n the month number to 1 digit (January="1", December="12"), see notes!
* @li %d the day number of the month to 2 digits (e.g. "01" on the first of March)
* @li %e the day number of the month to 1 digit (e.g. "1" on the first of March)
* @li %B the month name long form (e.g. "January")
* @li %b the month name short form (e.g. "Jan" for January)
* @li %h the month name short form (e.g. "Jan" for January)
* @li %A the weekday name long form (e.g. "Wednesday" for Wednesday)
* @li %a the weekday name short form (e.g. "Wed" for Wednesday)
* @li %j the day of the year number to 3 digits (e.g. "001" for 1 Jan)
* @li %V the ISO week of the year number to 2 digits (e.g. "01" for ISO Week 1)
* @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)
* @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)
* @li %u the day of the week number to 1 digit (e.g. "1" for Monday)
* @li %D the US short date format (e.g. "%m/%d/%y")
* @li %F the ISO short date format (e.g. "%Y-%m-%d")
* @li %x the KDE locale short date format
* @li %% the literal "%"
* @li %t a tab character
*
* Everything else in the format string will be taken as literal text.
*
* Examples:
* "%Y-%m-%d" = "2009-01-01"
* "%Y-%-m-%_4d" = "2009-1- 1"
*
* The following format codes behave differently in the KDE and POSIX standards
* @li %e in GNU/POSIX is space padded to 2 digits, in KDE is not padded
* @li %n in GNU/POSIX is newline, in KDE is short month number
*
* The following POSIX format codes are currently not supported:
* @li %U US week number
* @li %w US day of week
* @li %W US week number
* @li %O locale's alternative numeric symbols, in KDE is not supported
*
* %0 is not supported as the returned result is always in the locale's chosen numeric symbol digit set.
*
* @see formatDate()
* @param formatString the date format to use
* @param formatStandard the standard the @p dateFormat uses, defaults to KDE Standard
* @return The date as a localized string
*/
QString formatDate(const QString &formatString,
KLocale::DateTimeFormatStandard formatStandard = KLocale::KdeFormat) const;
/**
* Returns a Date Component as a localized string in the requested format.
*
* See @ref formatting for more details on Date Formatting.
*
* Each format size may vary depending on Locale and Calendar System but will
* generally match the format description. Some formats may not be directly
* valid but a sensible value will always be returned.
*
* For example for 2010-01-01 the KLocale::Month with en_US Locale and Gregorian calendar may return:
* KLocale::ShortNumber = "1"
* KLocale::LongNumber = "01"
* KLocale::NarrowName = "J"
* KLocale::ShortName = "Jan"
* KLocale::LongName = "January"
*
* @see formatDate()
* @param component The date component to return
* @param format The format to return the @p component in
* @param weekNumberSystem To override the default Week Number System to use
* @return The string form of the date component
*/
QString formatDate(KLocale::DateTimeComponent component,
KLocale::DateTimeComponentFormat format = KLocale::DefaultComponentFormat,
KLocale::WeekNumberSystem weekNumberSystem = KLocale::DefaultWeekNumber) const;
/**
* Converts a localized date string to a KLocalizedDate using either the
* Global Calendar System and Locale, or the provided Calendar System.
*
* See @ref parsing for more details on Date Parsing from strings.
*
* This method is more liberal and will return a valid date if the
* @p dateString matches any of the KLocale::ReadDateFlags formats
* for the Locale.
*
* If you require a certain KLocale::ReadDateFlags format or a customized
* format string, use one of the other readDate() methods.
*
* @param dateString the string to parse
* @param parseMode how strictly to apply the locale formats to the @p dateString
* @param calendar the Calendar System to use when parsing the date
* @return the localized date parsed from the string
*/
static KLocalizedDate readDate(const QString &dateString,
KLocale::DateTimeParseMode parseMode = KLocale::LiberalParsing,
const KCalendarSystem *calendar = 0);
/**
* Converts a localized date string to a KLocalizedDate using either the
* Global Calendar System and Locale, or the provided Calendar System.
*
* See @ref parsing for more details on Date Parsing from strings.
*
* This method is stricter and will return a valid date only if the
* @p dateString matches one of the @p dateFlags formats requested.
*
* If you require any KLocale::ReadDateFlags format or a customized format
* string, use one of the other readDate() methods.
*
* @param dateString the string to parse
* @param formatFlags the locale format(s) to try parse the string with
* @param parseMode how strictly to apply the @p formatFlags to the @p dateString
* @param calendar the Calendar System to use when parsing the date
* @return the localized date parsed from the string
*/
static KLocalizedDate readDate(const QString &dateString,
KLocale::ReadDateFlags formatFlags,
KLocale::DateTimeParseMode parseMode = KLocale::LiberalParsing,
const KCalendarSystem *calendar = 0);
/**
* Converts a localized date string to a KLocalizedDate using either the
* Global Calendar System and Locale, or the provided Calendar System.
*
* See @ref parsing for more details on Date Parsing from strings.
*
* This method allows you to define your own date format to parse the date
* string with.
*
* If you require one of the standard any KLocale::ReadDateFlags formats
* then use one of the other readDate() methods.
*
* @param dateString the string to parse
* @param dateFormat the date format to try parse the string with
* @param parseMode how strictly to apply the @p dateFormat to the @p dateString
* @param formatStandard the standard the @p dateFormat format uses
* @param calendar the Calendar System to use when parsing the date
* @return the localized date parsed from the string
*/
static KLocalizedDate readDate(const QString &dateString,
const QString &dateFormat,
KLocale::DateTimeParseMode parseMode = KLocale::LiberalParsing,
KLocale::DateTimeFormatStandard formatStandard = KLocale::KdeFormat,
const KCalendarSystem *calendar = 0);
/**
* Returns a KLocalizedDate containing a date @p years years later.
*
* @see addYearsTo()
* @see addMonths() addDays()
* @see dateDifference() yearsDifference()
* @param years The number of years to add
* @return The new date, null date if any errors
*/
KLocalizedDate addYears(int years) const;
/**
* Add years onto this date instance.
*
* If the result of the addition is invalid in the current Calendar System
* then the date will become invalid.
*
* @see addYears()
* @see addMonthsTo() addDaysTo()
* @see dateDifference() yearsDifference()
* @param years The number of years to add
* @return if the resulting date is valid
*/
bool addYearsTo(int years);
/**
* Returns a KLocalizedDate containing a date @p months months later.
*
* @see addMonthsTo()
* @see addYears() addDays()
* @see dateDifference() yearsDifference()
* @param months number of months to add
* @return The new date, null date if any errors
*/
KLocalizedDate addMonths(int months) const;
/**
* Add months onto this date instance.
*
* If the result of the addition is invalid in the current Calendar System
* then the date will become invalid.
*
* @see addMonths()
* @see addYearsTo() addDaysTo()
* @see dateDifference() yearsDifference()
* @param months The number of months to add
* @return if the resulting date is valid
*/
bool addMonthsTo(int months);
/**
* Returns a KLocalizedDate containing a date @p days days later.
*
* @see addDaysTo()
* @see addYears() addMonths()
* @see dateDifference() yearsDifference()
* @param days number of days to add
* @return The new date, null date if any errors
*/
KLocalizedDate addDays(int days) const;
/**
* Add days onto this date instance.
*
* If the result of the addition is invalid in the current Calendar System
* then the date will become invalid.
*
* @see addDays()
* @see addYearsTo(), addMonthsTo()
* @see dateDifference() yearsDifference()
* @param days The number of days to add
* @return if the resulting date is valid
*/
bool addDaysTo(int days);
/**
* Returns the difference between this and another date in years, months and days
* in the current Calendar System.
*
* The difference is always calculated from the earlier date to the later
* date in year, month and day order, with the @p direction parameter
* indicating which direction the difference is applied from this date.
* In other words, this difference can be added onto the earlier date in
* year, month, day order to reach the later date.
*
* For example, the difference between 2010-06-10 and 2012-09-5 is 2 years,
* 2 months and 26 days. Note that the difference between two last days of
* the month is always 1 month, e.g. 2010-01-31 to 2010-02-28 is 1 month
* not 28 days.
*
* @see addYears() addMonths() addDays()
* @see yearsDifference() monthsDifference() daysDifference()
* @param toDate The date to end at
* @param yearsDiff Returns number of years difference
* @param monthsDiff Returns number of months difference
* @param daysDiff Returns number of days difference
* @param direction Returns direction of difference, 1 if this Date <= toDate, -1 otherwise
*/
void dateDifference(const KLocalizedDate &toDate,
int *yearsDiff, int *monthsDiff, int *daysDiff, int *direction) const;
/**
* Returns the difference between this and another date in years, months and days
* in the current Calendar System.
*
* The difference is always calculated from the earlier date to the later
* date in year, month and day order, with the @p direction parameter
* indicating which direction the difference is applied from this date.
* In other words, this difference can be added onto the earlier date in
* year, month, day order to reach the later date.
*
* For example, the difference between 2010-06-10 and 2012-09-5 is 2 years,
* 2 months and 26 days. Note that the difference between two last days of
* the month is always 1 month, e.g. 2010-01-31 to 2010-02-28 is 1 month
* not 28 days.
*
* @see addYears() addMonths() addDays()
* @see yearsDifference() monthsDifference() daysDifference()
* @param toDate The date to end at
* @param yearsDiff Returns number of years difference
* @param monthsDiff Returns number of months difference
* @param daysDiff Returns number of days difference
* @param direction Returns direction of difference, 1 if this Date <= toDate, -1 otherwise
*/
void dateDifference(const QDate &toDate,
int *yearsDiff, int *monthsDiff, int *daysDiff, int *direction) const;
/**
* Returns the difference between this and another date in completed calendar years
* in the current Calendar System.
*
* The returned value will be negative if @p toDate < this date.
*
* For example, the difference between 2010-06-10 and 2012-09-5 is 2 years.
*
* @see addYears()
* @see dateDifference() monthsDifference() daysDifference()
* @param toDate The date to end at
* @return The number of years difference
*/
int yearsDifference(const KLocalizedDate &toDate) const;
/**
* Returns the difference between this and another date in completed calendar years
* in the current Calendar System.
*
* The returned value will be negative if @p toDate < this date.
*
* For example, the difference between 2010-06-10 and 2012-09-5 is 2 years.
*
* @see addYears()
* @see dateDifference() monthsDifference() daysDifference()
* @param toDate The date to end at
* @return The number of years difference
*/
int yearsDifference(const QDate &toDate) const;
/**
* Returns the difference between this and another date in completed calendar months
* in the current Calendar System.
*
* The returned value will be negative if @p toDate < this date.
*
* For example, the difference between 2010-06-10 and 2012-09-5 is 26 months.
* Note that the difference between two last days of the month is always 1
* month, e.g. 2010-01-31 to 2010-02-28 is 1 month not 28 days.
*
* @see addMonths()
* @see dateDifference() yearsDifference() daysDifference()
* @param toDate The date to end at
* @return The number of months difference
*/
int monthsDifference(const KLocalizedDate &toDate) const;
/**
* Returns the difference between this and another date in completed calendar months
* in the current Calendar System.
*
* The returned value will be negative if @p toDate < this date.
*
* For example, the difference between 2010-06-10 and 2012-09-5 is 26 months.
* Note that the difference between two last days of the month is always 1
* month, e.g. 2010-01-31 to 2010-02-28 is 1 month not 28 days.
*
* @see addMonths()
* @see dateDifference() yearsDifference() daysDifference()
* @param toDate The date to end at
* @return The number of months difference
*/
int monthsDifference(const QDate &toDate) const;
/**
* Returns the difference between this and another date in days
* The returned value will be negative if @p toDate < this date.
*
* @see addDays()
* @see dateDifference() yearsDifference() monthsDifference()
* @param toDate The date to end at
* @return The number of days difference
*/
int daysDifference(const KLocalizedDate &toDate) const;
/**
* Returns the difference between this and another date in days
* The returned value will be negative if @p toDate < this date.
*
* @see addDays()
* @see dateDifference() yearsDifference() monthsDifference()
* @param toDate The date to end at
* @return The number of days difference
*/
int daysDifference(const QDate &toDate) const;
/**
* Returns a KLocalizedDate containing the first day of the currently set year
*
* @see lastDayOfYear()
* @return The first day of the year
*/
KLocalizedDate firstDayOfYear() const;
/**
* Returns a KLocalizedDate containing the last day of the currently set year
*
* @see firstDayOfYear()
* @return The last day of the year
*/
KLocalizedDate lastDayOfYear() const;
/**
* Returns a KLocalizedDate containing the first day of the currently set month
*
* @see lastDayOfMonth()
* @return The first day of the month
*/
KLocalizedDate firstDayOfMonth() const;
/**
* Returns a KLocalizedDate containing the last day of the currently set month
*
* @see firstDayOfMonth()
* @return The last day of the month
*/
KLocalizedDate lastDayOfMonth() const;
/**
* KLocalizedDate equality operator
*
* @param other the date to compare
*/
bool operator==(const KLocalizedDate &other) const;
/**
* QDate equality operator
*
* @param other the date to compare
*/
bool operator==(const QDate &other) const;
/**
* KLocalizedDate inequality operator
*
* @param other the date to compare
*/
bool operator!=(const KLocalizedDate &other) const;
/**
* QDate inequality operator
*
* @param other the date to compare
*/
bool operator!=(const QDate &other) const;
/**
* KLocalizedDate less than operator
*
* @param other the date to compare
*/
bool operator<(const KLocalizedDate &other) const;
/**
* QDate less than operator
*
* @param other the date to compare
*/
bool operator<(const QDate &other) const;
/**
* KLocalizedDate less than or equal to operator
*
* @param other the date to compare
*/
bool operator<=(const KLocalizedDate &other) const;
/**
* QDate less than or equal to operator
*
* @param other the date to compare
*/
bool operator<=(const QDate &other) const;
/**
* KLocalizedDate greater than operator
*
* @param other the date to compare
*/
bool operator>(const KLocalizedDate &other) const;
/**
* QDate greater than operator
*
* @param other the date to compare
*/
bool operator>(const QDate &other) const;
/**
* KLocalizedDate greater than or equal to operator
*
* @param other the date to compare
*/
bool operator>=(const KLocalizedDate &other) const;
/**
* QDate greater than or equal to operator
*
* @param other the date to compare
*/
bool operator>=(const QDate &other) const;
private:
friend QDataStream KDECORE_EXPORT &operator<<(QDataStream &out, const KLocalizedDate &date);
friend QDataStream KDECORE_EXPORT &operator>>(QDataStream &in, KLocalizedDate &date);
friend QDebug KDECORE_EXPORT operator<<(QDebug, const KLocalizedDate &);
QSharedDataPointer<KLocalizedDatePrivate> d;
};
Q_DECLARE_METATYPE(KLocalizedDate)
/**
* Data stream output operator
*
* @param out the datastream to write to
* @param date the date to write to the stream
*/
QDataStream KDECORE_EXPORT &operator<<(QDataStream &out, const KLocalizedDate &date);
/**
* Data stream input operator
*
* @param in the datastream to read from
* @param date the date to read from the stream
*/
QDataStream KDECORE_EXPORT &operator>>(QDataStream &in, KLocalizedDate &date);
/**
* Debug stream output operator
*
* @param debug the debug datastream to write to
* @param date the date to write to the stream
*/
QDebug KDECORE_EXPORT operator<<(QDebug debug, const KLocalizedDate &date);
#endif // KLOCALIZEDDATE_H