summaryrefslogtreecommitdiff
path: root/libopie/pim/otimezone.cpp
blob: b2bd3aa575b14e244a2e132e6252cb14611f719e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>

#include "otimezone.h"

namespace {

    QDateTime utcTime( time_t t) {
        tm* broken = ::gmtime( &t );
        QDateTime ret;
        ret.setDate( QDate( broken->tm_year + 1900, broken->tm_mon +1, broken->tm_mday ) );
        ret.setTime( QTime( broken->tm_hour, broken->tm_min, broken->tm_sec ) );
        return ret;
    }
    QDateTime utcTime( time_t t, const QString&  zone) {
        QCString org = ::getenv( "TZ" );
        ::setenv( "TZ", zone.latin1(), true );
        ::tzset();

        tm* broken = ::localtime( &t );
        ::setenv( "TZ", org, true );

        QDateTime ret;
        ret.setDate( QDate( broken->tm_year + 1900, broken->tm_mon +1, broken->tm_mday ) );
        ret.setTime( QTime( broken->tm_hour, broken->tm_min, broken->tm_sec ) );

        return ret;
    }
    time_t to_Time_t( const QDateTime& utc, const QString& str ) {
        QDate d = utc.date();
        QTime t = utc.time();

        tm broken;
        broken.tm_year = d.year()  - 1900;
        broken.tm_mon  = d.month() - 1;
        broken.tm_mday = d.day();
        broken.tm_hour = t.hour();
        broken.tm_min  = t.minute();
        broken.tm_sec = t.second();

        QCString org = ::getenv( "TZ" );
        ::setenv( "TZ", str.latin1(), true );
        ::tzset();

        time_t ti = ::mktime( &broken );
        ::setenv( "TZ", org, true );

        return ti;
    }
}
OTimeZone::OTimeZone( const ZoneName& zone )
    : m_name(zone) {
}
OTimeZone::~OTimeZone() {
}

bool OTimeZone::isValid()const {
    return !m_name.isEmpty();
}

/*
 * we will get the current timezone
 * and ask it to convert to the timezone date
 */
QDateTime OTimeZone::toLocalDateTime( const QDateTime& dt) {
    return OTimeZone::current().toDateTime( dt, *this );
}
QDateTime OTimeZone::toUTCDateTime( const QDateTime& dt ) {
    return OTimeZone::utc().toDateTime( dt, *this );
}
QDateTime OTimeZone::fromUTCDateTime( time_t t) {
    return utcTime( t );
}
QDateTime OTimeZone::toDateTime( time_t t) {
    return utcTime( t, m_name );
}
/*
 * convert dt to utc using zone.m_name
 * convert utc -> timeZoneDT using this->m_name
 */
QDateTime OTimeZone::toDateTime( const QDateTime& dt, const OTimeZone& zone ) {
    time_t utc = to_Time_t( dt, zone.m_name );
    qWarning("%d %s", utc, zone.m_name.latin1() );
    return utcTime( utc, m_name );
}
time_t OTimeZone::fromDateTime( const QDateTime& time ) {
    return to_Time_t( time, m_name );
}
time_t OTimeZone::fromUTCDateTime( const QDateTime& time ) {
    return to_Time_t( time, "UTC" );
}
OTimeZone OTimeZone::current() {
    QCString str = ::getenv("TZ");
    OTimeZone zone( str );
    return zone;
}
OTimeZone OTimeZone::utc() {
    return OTimeZone("UTC");
}
QString OTimeZone::timeZone()const {
    return m_name;
}