/* -*- c++ -*-
kmime_dateformatter.h
KMime, the KDE Internet mail/usenet news message library.
Copyright (c) 2001 the KMime authors.
See file AUTHORS for details
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.
*/
/**
@file
This file is part of the API for handling @ref MIME data and
defines the DateFormatter class.
@brief
Defines the DateFormatter class.
@authors the KMime authors (see AUTHORS file)
@glossary @anchor RFC2822 @anchor rfc2822 @b RFC @b 2822:
RFC that defines the
Internet Message Format.
@glossary @anchor ISO8601 @anchor iso8601 @b ISO @b 8601:
International Standards Organization (ISO) standard that defines the
international standard for date and time representations.
@glossary @anchor ctime @b ctime:
a Unix library call which returns the local time as a human readable
ASCII string of the form "Sun Mar 31 02:08:35 2002".
*/
#ifndef __KMIME_DATEFORMATTER_H__
#define __KMIME_DATEFORMATTER_H__
#include
#include
#include
#include "kmime_export.h"
namespace KMime {
/**
@brief
A class for abstracting date formatting.
This class deals with different kinds of date display formats.
The formats supported include:
- @b fancy "Today 02:08:35"
- @b ctime as with the @ref ctime function, eg. "Sun Mar 31 02:08:35 2002"
- @b localized according to the control center setting, eg. "2002-03-31 02:08"
- @b iso according to the @ref ISO8601 standard, eg. "2002-03-31 02:08:35"
- @b rfc according to @ref RFC2822 (Section 3.3), eg. "Sun, 31 Mar 2002 02:08:35 -0500"
- @b custom "whatever you like"
*/
class KMIME_EXPORT DateFormatter
{
public:
/**
The different types of date formats.
*/
enum FormatType {
CTime, /**< ctime "Sun Mar 31 02:08:35 2002" */
Localized, /**< localized "2002-03-31 02:08" */
Fancy, /**< fancy "Today 02:08:35" */
Iso, /**< iso "2002-03-31 02:08:35" */
Rfc, /**< rfc "Sun, 31 Mar 2002 02:08:35 -0500" */
Custom /**< custom "whatever you like" */
};
/**
Constructs a date formatter with a default #FormatType.
@param ftype is the default #FormatType to use.
*/
explicit DateFormatter( FormatType ftype=DateFormatter::Fancy );
/**
Destroys the date formatter.
*/
~DateFormatter();
/**
Returns the #FormatType currently set.
@see setFormat().
*/
FormatType format() const;
/**
Sets the date format to @p ftype.
@param ftype is the #FormatType.
@see format().
*/
void setFormat( FormatType ftype );
/**
Constructs a formatted date string from time_t @p t.
@param t is the time_t to use for formatting.
@param lang is the language, only used if #FormatType is #Localized.
@param shortFormat if true, create the short version of the date string,
only used if #FormatType is #Localized.
@param includeSecs if true, include the seconds field in the date string,
only used if #FormatType is #Localized.
@return a QString containing the formatted date.
*/
QString dateString( time_t t, const QString &lang=QString(),
bool shortFormat=true, bool includeSecs=false ) const;
/**
Constructs a formatted date string from QDateTime @p dtime.
@param dtime is the QDateTime to use for formatting.
@param lang is the language, only used if #FormatType is #Localized.
@param shortFormat if true, create the short version of the date string,
only used if #FormatType is #Localized.
@param includeSecs if true, include the seconds field in the date string,
only used if #FormatType is #Localized.
@return a QString containing the formatted date.
*/
QString dateString( const QDateTime &dtime, const QString &lang=QString(),
bool shortFormat=true, bool includeSecs=false ) const;
/**
Sets the custom format for date to string conversions to @p format.
This method accepts the same arguments as QDateTime::toString(), but
also supports the "Z" expression which is substituted with the
@ref RFC2822 (Section 3.3) style numeric timezone (-0500).
@param format is a QString containing the custom format.
@see QDateTime::toString(), customFormat().
*/
void setCustomFormat( const QString &format );
/**
Returns the custom format string.
@see setCustomFormat().
*/
QString customFormat() const;
/**
Resets the cached current date used for calculating the fancy date.
This should be called whenever the current date changed, i.e. on midnight.
@deprecated Can be safely removed. The date change is taken care of internally (as of 4.3).
*/
void reset();
//static methods
/**
Convenience function dateString
@param ftype is the #FormatType to use.
@param t is the time_t to use for formatting.
@param data is either the format when #FormatType is Custom,
or language when #FormatType is #Localized.
@param shortFormat if true, create the short version of the date string,
only used if #FormatType is #Localized.
@param includeSecs if true, include the seconds field in the date string,
only used if #FormatType is #Localized.
@return a QString containing the formatted date.
*/
static QString formatDate( DateFormatter::FormatType ftype, time_t t,
const QString &data=QString(),
bool shortFormat=true,
bool includeSecs=false );
/**
Convenience function, same as formatDate() but returns the current time
formatted.
@param ftype is the #FormatType to use.
@param data is either the format when #FormatType is Custom,
or language when #FormatType is #Localized.
@param shortFormat if true, create the short version of the date string,
only used if #FormatType is #Localized.
@param includeSecs if true, include the seconds field in the date string,
only used if #FormatType is #Localized.
@return a QString containing the formatted date.
*/
static QString formatCurrentDate( DateFormatter::FormatType ftype,
const QString &data=QString(),
bool shortFormat=true,
bool includeSecs=false );
/**
Returns true if the current time is on daylight savings time; else false.
*/
static bool isDaylight();
protected:
/**
Returns a QString containing the specified time_t @p t formatted
using the #Fancy #FormatType.
@param t is the time_t to use for formatting.
*/
QString fancy( time_t t ) const ;
/**
Returns a QString containing the specified time_t @p t formatted
using the #Localized #FormatType.
@param t is the time_t to use for formatting.
@param shortFormat if true, create the short version of the date string.
@param includeSecs if true, include the seconds field in the date string.
@param lang is a QString containing the language to use.
*/
QString localized( time_t t, bool shortFormat=true,
bool includeSecs=false,
const QString &lang=QString() ) const;
/**
Returns a QString containing the specified time_t @p t formatted
with the ctime() function.
@param t is the time_t to use for formatting.
*/
QString cTime( time_t t ) const;
/**
Returns a QString containing the specified time_t @p t in the
"%Y-%m-%d %H:%M:%S" #Iso #FormatType.
@param t is the time_t to use for formatting.
*/
QString isoDate( time_t t ) const;
/**
Returns a QString containing the specified time_t @p t in the
#Rfc #FormatType.
@param t is the time_t to use for formatting.
*/
QString rfc2822( time_t t ) const;
/**
Returns a QString containing the specified time_t @p t formatted
with a previously specified custom format.
@param t time used for formatting
*/
QString custom( time_t t ) const;
/**
Returns a QString that identifies the timezone (eg."-0500")
of the specified time_t @p t.
@param t time to compute timezone from.
*/
QByteArray zone( time_t t ) const;
/**
Converts QDateTime @p dt to a time_t value.
@param dt is the QDateTime to be converted.
@return the time_t equivalent of the specified QDateTime.
*/
time_t qdateToTimeT( const QDateTime &dt ) const;
private:
//@cond PRIVATE
FormatType mFormat;
mutable time_t mTodayOneSecondBeforeMidnight;
mutable QDateTime mUnused; // KDE5: remove
QString mCustomFormat;
static int mDaylight;
//@endcond
};
} // namespace KMime
#endif /* __KMIME_DATEFORMATTER_H__ */