Diffstat (limited to 'library/backend/timeconversion.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | library/backend/timeconversion.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/library/backend/timeconversion.cpp b/library/backend/timeconversion.cpp index 3c25922..df7b0d5 100644 --- a/library/backend/timeconversion.cpp +++ b/library/backend/timeconversion.cpp @@ -1,238 +1,247 @@ /**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include <qglobal.h>
#include <qtopia/timeconversion.h>
#include <qregexp.h>
#include <stdlib.h>
QString TimeConversion::toString( const QDate &d )
{
- QString r = QString::number( d.day() ) + "." +
+ QString empty;
+ if ( d.isNull() )
+ return empty;
+
+ QString r = QString::number( d.day() ) + "." +
QString::number( d.month() ) + "." +
QString::number( d.year() );
- //qDebug("TimeConversion::toString %s", r.latin1());
- return r;
+ //qDebug("TimeConversion::toString %s", r.latin1());
+
+ return r;
}
QDate TimeConversion::fromString( const QString &datestr )
{
+ QDate empty;
+ if ( datestr.isEmpty() )
+ return empty;
+
int monthPos = datestr.find('.');
int yearPos = datestr.find('.', monthPos+1 );
if ( monthPos == -1 || yearPos == -1 ) {
qDebug("fromString didn't find . in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, yearPos );
return QDate();
}
int d = datestr.left( monthPos ).toInt();
int m = datestr.mid( monthPos+1, yearPos - monthPos - 1 ).toInt();
int y = datestr.mid( yearPos+1 ).toInt();
QDate date ( y,m,d );
//qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, yearPos);
return date;
}
time_t TimeConversion::toUTC( const QDateTime& dt )
{
time_t tmp;
struct tm *lt;
#if defined(_OS_WIN32) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64)
_tzset();
#else
tzset();
#endif
// get a tm structure from the system to get the correct tz_name
tmp = time( 0 );
lt = localtime( &tmp );
lt->tm_sec = dt.time().second();
lt->tm_min = dt.time().minute();
lt->tm_hour = dt.time().hour();
lt->tm_mday = dt.date().day();
lt->tm_mon = dt.date().month() - 1; // 0-11 instead of 1-12
lt->tm_year = dt.date().year() - 1900; // year - 1900
//lt->tm_wday = dt.date().dayOfWeek(); ignored anyway
//lt->tm_yday = dt.date().dayOfYear(); ignored anyway
lt->tm_wday = -1;
lt->tm_yday = -1;
// tm_isdst negative -> mktime will find out about DST
lt->tm_isdst = -1;
// keep tm_zone and tm_gmtoff
tmp = mktime( lt );
return tmp;
}
QDateTime TimeConversion::fromUTC( time_t time )
{
struct tm *lt;
#if defined(_OS_WIN32) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64)
_tzset();
#else
tzset();
#endif
lt = localtime( &time );
QDateTime dt;
dt.setDate( QDate( lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday ) );
dt.setTime( QTime( lt->tm_hour, lt->tm_min, lt->tm_sec ) );
return dt;
}
int TimeConversion::secsTo( const QDateTime &from, const QDateTime &to )
{
return toUTC( to ) - toUTC( from );
}
QCString TimeConversion::toISO8601( const QDate &d )
{
time_t tmp = toUTC( d );
struct tm *utc = gmtime( &tmp );
QCString str;
str.sprintf("%04d%02d%02d", (utc->tm_year + 1900), utc->tm_mon+1, utc->tm_mday );
return str;
}
QCString TimeConversion::toISO8601( const QDateTime &dt )
{
time_t tmp = toUTC( dt );
struct tm *utc = gmtime( &tmp );
QCString str;
str.sprintf("%04d%02d%02dT%02d%02d%02dZ",
(utc->tm_year + 1900), utc->tm_mon+1, utc->tm_mday,
utc->tm_hour, utc->tm_min, utc->tm_sec );
return str;
}
QDateTime TimeConversion::fromISO8601( const QCString &s )
{
#if defined(_OS_WIN32) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64)
_tzset();
#else
tzset();
#endif
struct tm thetime;
QCString str = s.copy();
str.replace(QRegExp("-"), "" );
str.replace(QRegExp(":"), "" );
str.stripWhiteSpace();
str = str.lower();
int i = str.find( "t" );
QCString date;
QCString timestr;
if ( i != -1 ) {
date = str.left( i );
timestr = str.mid( i+1 );
} else {
date = str;
}
// qDebug("--- parsing ISO time---");
memset( &thetime, 0, sizeof(tm) );
thetime.tm_year = 100;
thetime.tm_mon = 0;
thetime.tm_mday = 0;
thetime.tm_hour = 0;
thetime.tm_min = 0;
thetime.tm_sec = 0;
// qDebug("date = %s", date.data() );
switch( date.length() ) {
case 8:
thetime.tm_mday = date.right( 2 ).toInt();
case 6:
thetime.tm_mon = date.mid( 4, 2 ).toInt() - 1;
case 4:
thetime.tm_year = date.left( 4 ).toInt();
thetime.tm_year -= 1900;
break;
default:
break;
}
int tzoff = 0;
bool inLocalTime = FALSE;
if ( timestr.find( 'z' ) == (int)timestr.length() - 1 )
// UTC
timestr = timestr.left( timestr.length() -1 );
else {
int plus = timestr.find( "+" );
int minus = timestr.find( "-" );
if ( plus != -1 || minus != -1 ) {
// have a timezone offset
plus = (plus != -1) ? plus : minus;
QCString off = timestr.mid( plus );
timestr = timestr.left( plus );
int tzoffhour = 0;
int tzoffmin = 0;
switch( off.length() ) {
case 5:
tzoffmin = off.mid(3).toInt();
case 3:
tzoffhour = off.left(3).toInt();
default:
break;
}
tzoff = 60*tzoffhour + tzoffmin;
} else
inLocalTime = TRUE;
}
// get the time:
switch( timestr.length() ) {
case 6:
thetime.tm_sec = timestr.mid( 4 ).toInt();
case 4:
thetime.tm_min = timestr.mid( 2, 2 ).toInt();
case 2:
thetime.tm_hour = timestr.left( 2 ).toInt();
default:
break;
}
int tzloc = 0;
time_t tmp = time( 0 );
if ( !inLocalTime ) {
// have to get the offset between gmt and local time
struct tm *lt = localtime( &tmp );
tzloc = mktime( lt );
struct tm *ut = gmtime( &tmp );
tzloc -= mktime( ut );
}
// qDebug("time: %d %d %d, tzloc=%d, tzoff=%d", thetime->tm_hour, thetime->tm_min, thetime->tm_sec,
// tzloc, tzoff );
tmp = mktime( &thetime );
tmp += 60*(-tzloc + tzoff);
return fromUTC( tmp );
}
|