/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.  For licensing terms and
** conditions see http://qt.digia.com/licensing.  For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file.  Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: http://www.gnu.org/copyleft/fdl.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
    \qmltype Date
    \inqmlmodule QtQml 2
    \brief Provides date functions

    The QML Date object extends the JS Date object with
    locale aware functions.

    Functions that accept a locale format may be either an enumeration
    value:
    \table
    \row \li Locale.LongFormat \li The long version of the string; for example, returning "January" as a month name.
    \row \li Locale.ShortFormat \li The short version of the string; for example, returning "Jan" as a month name.
    \row \li Locale.NarrowFormat \li A special version for use when space is limited;
        for example, returning "J" as a month name. Note that the narrow format might contain
        the same text for different months and days or it can even be an empty string if the
        locale doesn't support narrow names, so you should avoid using it for date formatting.
        Also, for the system locale this format is the same as ShortFormat.
    \endtable

    or a string specifying the format  These expressions may be used for format dates:
    \table
    \header \li Expression \li Output
    \row \li d \li the day as number without a leading zero (1 to 31)
    \row \li dd \li the day as number with a leading zero (01 to 31)
    \row \li ddd
         \li the abbreviated localized day name (e.g. 'Mon' to 'Sun').
    \row \li dddd
         \li the long localized day name (e.g. 'Monday' to 'Sunday').
    \row \li M \li the month as number without a leading zero (1 to 12)
    \row \li MM \li the month as number with a leading zero (01 to 12)
    \row \li MMM
         \li the abbreviated localized month name (e.g. 'Jan' to 'Dec').
    \row \li MMMM
         \li the long localized month name (e.g. 'January' to 'December').
    \row \li yy \li the year as two digit number (00 to 99)
    \row \li yyyy \li the year as four digit number. If the year is negative,
            a minus sign is prepended in addition.
    \endtable

    All other input characters will be ignored. Any sequence of characters that
    are enclosed in singlequotes will be treated as text and not be used as an
    expression. Two consecutive singlequotes ("''") are replaced by a singlequote
    in the output.

    Example format strings (assuming that the Date is the 20 July
    1969):

    \table
    \header \li Format            \li Result
    \row    \li dd.MM.yyyy        \li 20.07.1969
    \row    \li ddd MMMM d yy     \li Sun July 20 69
    \row    \li 'The day is' dddd \li The day is Sunday
    \endtable

    These expressions may be used for formatting time:

    \table
    \header \li Expression \li Output
    \row \li h
         \li the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)
    \row \li hh
         \li the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)
    \row \li H
         \li the hour without a leading zero (0 to 23, even with AM/PM display)
    \row \li HH
         \li the hour with a leading zero (00 to 23, even with AM/PM display)
    \row \li m \li the minute without a leading zero (0 to 59)
    \row \li mm \li the minute with a leading zero (00 to 59)
    \row \li s \li the second without a leading zero (0 to 59)
    \row \li ss \li the second with a leading zero (00 to 59)
    \row \li z \li the milliseconds without leading zeroes (0 to 999)
    \row \li zzz \li the milliseconds with leading zeroes (000 to 999)
    \row \li AP or A
         \li use AM/PM display. \e AP will be replaced by either "AM" or "PM".
    \row \li ap or a
         \li use am/pm display. \e ap will be replaced by either "am" or "pm".
    \row \li t \li the timezone (for example "CEST")
    \endtable

    All other input characters will be ignored. Any sequence of characters that
    are enclosed in singlequotes will be treated as text and not be used as an
    expression. Two consecutive singlequotes ("''") are replaced by a singlequote
    in the output.

    Example format strings (assuming that the QTime is 14:13:09.042)

    \table
    \header \li Format \li Result
    \row \li hh:mm:ss.zzz \li 14:13:09.042
    \row \li h:m:s ap     \li 2:13:9 pm
    \row \li H:m:s a      \li 14:13:9 pm
    \endtable

    If the date is invalid, an empty string will be returned.

    Note: Using the locale-aware functions to perform date or time formatting can
    result in incorrectly formatted times, due to an inconsistency in specification
    between Qt and JS.  ECMA-262 specifies that historical dates should be intrepreted
    by projecting the current rules for daylight-saving onto past years, while Qt uses
    historical data (where available) to determine whether daylight-saving was in
    effect for a given date.  Therefore, constructing a Date value in JS and converting
    it to a string using the locale-aware functions can yield a result incorrect by one
    hour, if DST is currently in effect, while it was not for the time specified, or
    vice versa.

    \sa {QtQuick2::Locale}{Locale}
*/

/*!
    \qmlmethod string Date::toLocaleString(locale,format)

    Converts the Date to a string containing the date and time
    suitable for the specified \a locale
    in the specified \a format.

    If the format is not specified Locale.LongFormat will be used.

    If \a locale is not specified, the default locale will be used.

    The following example shows the current date and time formatted
    for the German locale:
    \code
    import QtQuick 2.0

    Text {
        text: "The date is: " +  Date().toLocaleString(Qt.locale("de_DE"))
    }
    \endcode
*/

/*!
    \qmlmethod string Date::toLocaleDateString(locale,format)

    Converts the Date to a string containing the date suitable for the specified \a locale
    in the specified \a format.

    If the format is not specified Locale.LongFormat will be used.

    If \a locale is not specified, the default locale will be used.

    The following example shows the current date formatted
    for the German locale:
    \code
    import QtQuick 2.0

    Text {
        text: "The date is: " +  Date().toLocaleDateString(Qt.locale("de_DE"))
    }
    \endcode
*/

/*!
    \qmlmethod string Date::toLocaleTimeString(locale,format)

    Converts the Date to a string containing the time suitable for the specified \a locale
    in the specified \a format.

    If the format is not specified Locale.LongFormat will be used.

    If \a locale is not specified, the default locale will be used.

    The following example shows the current time formatted
    for the German locale:
    \code
    import QtQuick 2.0

    Text {
        text: "The date is: " +  Date().toLocaleTimeString(Qt.locale("de_DE"))
    }
    \endcode
*/

/*!
    \qmlmethod string Date::timeZoneUpdated()

    Informs the JS engine that the system's timezone has been changed, which is necessary
    for the correct manipulation of date/time data.

    JS stores Date objects in UTC time; all access to and from Date components in local
    time involves the application of the current offset from UTC.  If the current offset
    changes due to the timezone being updated, the JS engine needs to be informed so that
    it can recalculate the offset.

    This function should be called after the system's timezone has been updated.

    For example, an application that changes the timezone would call timeZoneUpdated() after
    setting the new time zone:

    \code
        property string selectedTimeZone

        onSelectedTimeZoneChanged: {
            MyFunctions.setSystemTimeZone(selectedTimeZone)
            Date.timeZoneUpdated()
        }
    \endcode
*/
