-rw-r--r-- | library/backend/timeconversion.cpp | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/library/backend/timeconversion.cpp b/library/backend/timeconversion.cpp index ef7762d..3c25922 100644 --- a/library/backend/timeconversion.cpp +++ b/library/backend/timeconversion.cpp | |||
@@ -112,126 +112,127 @@ QCString TimeConversion::toISO8601( const QDate &d ) | |||
112 | return str; | 112 | return str; |
113 | } | 113 | } |
114 | 114 | ||
115 | QCString TimeConversion::toISO8601( const QDateTime &dt ) | 115 | QCString TimeConversion::toISO8601( const QDateTime &dt ) |
116 | { | 116 | { |
117 | time_t tmp = toUTC( dt ); | 117 | time_t tmp = toUTC( dt ); |
118 | struct tm *utc = gmtime( &tmp ); | 118 | struct tm *utc = gmtime( &tmp ); |
119 | 119 | ||
120 | QCString str; | 120 | QCString str; |
121 | str.sprintf("%04d%02d%02dT%02d%02d%02dZ", | 121 | str.sprintf("%04d%02d%02dT%02d%02d%02dZ", |
122 | (utc->tm_year + 1900), utc->tm_mon+1, utc->tm_mday, | 122 | (utc->tm_year + 1900), utc->tm_mon+1, utc->tm_mday, |
123 | utc->tm_hour, utc->tm_min, utc->tm_sec ); | 123 | utc->tm_hour, utc->tm_min, utc->tm_sec ); |
124 | return str; | 124 | return str; |
125 | } | 125 | } |
126 | 126 | ||
127 | QDateTime TimeConversion::fromISO8601( const QCString &s ) | 127 | QDateTime TimeConversion::fromISO8601( const QCString &s ) |
128 | { | 128 | { |
129 | 129 | ||
130 | #if defined(_OS_WIN32) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64) | 130 | #if defined(_OS_WIN32) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64) |
131 | _tzset(); | 131 | _tzset(); |
132 | #else | 132 | #else |
133 | tzset(); | 133 | tzset(); |
134 | #endif | 134 | #endif |
135 | 135 | ||
136 | struct tm *thetime = new tm; | 136 | struct tm thetime; |
137 | 137 | ||
138 | QCString str = s.copy(); | 138 | QCString str = s.copy(); |
139 | str.replace(QRegExp("-"), "" ); | 139 | str.replace(QRegExp("-"), "" ); |
140 | str.replace(QRegExp(":"), "" ); | 140 | str.replace(QRegExp(":"), "" ); |
141 | str.stripWhiteSpace(); | 141 | str.stripWhiteSpace(); |
142 | str = str.lower(); | 142 | str = str.lower(); |
143 | 143 | ||
144 | int i = str.find( "t" ); | 144 | int i = str.find( "t" ); |
145 | QCString date; | 145 | QCString date; |
146 | QCString timestr; | 146 | QCString timestr; |
147 | if ( i != -1 ) { | 147 | if ( i != -1 ) { |
148 | date = str.left( i ); | 148 | date = str.left( i ); |
149 | timestr = str.mid( i+1 ); | 149 | timestr = str.mid( i+1 ); |
150 | } else { | 150 | } else { |
151 | date = str; | 151 | date = str; |
152 | } | 152 | } |
153 | 153 | ||
154 | // qDebug("--- parsing ISO time---"); | 154 | // qDebug("--- parsing ISO time---"); |
155 | thetime->tm_year = 100; | 155 | memset( &thetime, 0, sizeof(tm) ); |
156 | thetime->tm_mon = 0; | 156 | thetime.tm_year = 100; |
157 | thetime->tm_mday = 0; | 157 | thetime.tm_mon = 0; |
158 | thetime->tm_hour = 0; | 158 | thetime.tm_mday = 0; |
159 | thetime->tm_min = 0; | 159 | thetime.tm_hour = 0; |
160 | thetime->tm_sec = 0; | 160 | thetime.tm_min = 0; |
161 | thetime.tm_sec = 0; | ||
161 | 162 | ||
162 | // qDebug("date = %s", date.data() ); | 163 | // qDebug("date = %s", date.data() ); |
163 | 164 | ||
164 | switch( date.length() ) { | 165 | switch( date.length() ) { |
165 | case 8: | 166 | case 8: |
166 | thetime->tm_mday = date.right( 2 ).toInt(); | 167 | thetime.tm_mday = date.right( 2 ).toInt(); |
167 | case 6: | 168 | case 6: |
168 | thetime->tm_mon = date.mid( 4, 2 ).toInt() - 1; | 169 | thetime.tm_mon = date.mid( 4, 2 ).toInt() - 1; |
169 | case 4: | 170 | case 4: |
170 | thetime->tm_year = date.left( 4 ).toInt(); | 171 | thetime.tm_year = date.left( 4 ).toInt(); |
171 | thetime->tm_year -= 1900; | 172 | thetime.tm_year -= 1900; |
172 | break; | 173 | break; |
173 | default: | 174 | default: |
174 | break; | 175 | break; |
175 | } | 176 | } |
176 | 177 | ||
177 | int tzoff = 0; | 178 | int tzoff = 0; |
178 | bool inLocalTime = FALSE; | 179 | bool inLocalTime = FALSE; |
179 | if ( timestr.find( 'z' ) == (int)timestr.length() - 1 ) | 180 | if ( timestr.find( 'z' ) == (int)timestr.length() - 1 ) |
180 | // UTC | 181 | // UTC |
181 | timestr = timestr.left( timestr.length() -1 ); | 182 | timestr = timestr.left( timestr.length() -1 ); |
182 | else { | 183 | else { |
183 | int plus = timestr.find( "+" ); | 184 | int plus = timestr.find( "+" ); |
184 | int minus = timestr.find( "-" ); | 185 | int minus = timestr.find( "-" ); |
185 | if ( plus != -1 || minus != -1 ) { | 186 | if ( plus != -1 || minus != -1 ) { |
186 | // have a timezone offset | 187 | // have a timezone offset |
187 | plus = (plus != -1) ? plus : minus; | 188 | plus = (plus != -1) ? plus : minus; |
188 | QCString off = timestr.mid( plus ); | 189 | QCString off = timestr.mid( plus ); |
189 | timestr = timestr.left( plus ); | 190 | timestr = timestr.left( plus ); |
190 | 191 | ||
191 | int tzoffhour = 0; | 192 | int tzoffhour = 0; |
192 | int tzoffmin = 0; | 193 | int tzoffmin = 0; |
193 | switch( off.length() ) { | 194 | switch( off.length() ) { |
194 | case 5: | 195 | case 5: |
195 | tzoffmin = off.mid(3).toInt(); | 196 | tzoffmin = off.mid(3).toInt(); |
196 | case 3: | 197 | case 3: |
197 | tzoffhour = off.left(3).toInt(); | 198 | tzoffhour = off.left(3).toInt(); |
198 | default: | 199 | default: |
199 | break; | 200 | break; |
200 | } | 201 | } |
201 | tzoff = 60*tzoffhour + tzoffmin; | 202 | tzoff = 60*tzoffhour + tzoffmin; |
202 | } else | 203 | } else |
203 | inLocalTime = TRUE; | 204 | inLocalTime = TRUE; |
204 | } | 205 | } |
205 | 206 | ||
206 | // get the time: | 207 | // get the time: |
207 | switch( timestr.length() ) { | 208 | switch( timestr.length() ) { |
208 | case 6: | 209 | case 6: |
209 | thetime->tm_sec = timestr.mid( 4 ).toInt(); | 210 | thetime.tm_sec = timestr.mid( 4 ).toInt(); |
210 | case 4: | 211 | case 4: |
211 | thetime->tm_min = timestr.mid( 2, 2 ).toInt(); | 212 | thetime.tm_min = timestr.mid( 2, 2 ).toInt(); |
212 | case 2: | 213 | case 2: |
213 | thetime->tm_hour = timestr.left( 2 ).toInt(); | 214 | thetime.tm_hour = timestr.left( 2 ).toInt(); |
214 | default: | 215 | default: |
215 | break; | 216 | break; |
216 | } | 217 | } |
217 | 218 | ||
218 | int tzloc = 0; | 219 | int tzloc = 0; |
219 | time_t tmp = time( 0 ); | 220 | time_t tmp = time( 0 ); |
220 | if ( !inLocalTime ) { | 221 | if ( !inLocalTime ) { |
221 | // have to get the offset between gmt and local time | 222 | // have to get the offset between gmt and local time |
222 | struct tm *lt = localtime( &tmp ); | 223 | struct tm *lt = localtime( &tmp ); |
223 | tzloc = mktime( lt ); | 224 | tzloc = mktime( lt ); |
224 | struct tm *ut = gmtime( &tmp ); | 225 | struct tm *ut = gmtime( &tmp ); |
225 | tzloc -= mktime( ut ); | 226 | tzloc -= mktime( ut ); |
226 | } | 227 | } |
227 | // qDebug("time: %d %d %d, tzloc=%d, tzoff=%d", thetime->tm_hour, thetime->tm_min, thetime->tm_sec, | 228 | // qDebug("time: %d %d %d, tzloc=%d, tzoff=%d", thetime->tm_hour, thetime->tm_min, thetime->tm_sec, |
228 | // tzloc, tzoff ); | 229 | // tzloc, tzoff ); |
229 | 230 | ||
230 | tmp = mktime( thetime ); | 231 | tmp = mktime( &thetime ); |
231 | tmp += 60*(-tzloc + tzoff); | 232 | tmp += 60*(-tzloc + tzoff); |
232 | 233 | ||
233 | delete thetime; | 234 | |
234 | 235 | ||
235 | return fromUTC( tmp ); | 236 | return fromUTC( tmp ); |
236 | } | 237 | } |
237 | 238 | ||