summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/backend/timeconversion.cpp33
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
115QCString TimeConversion::toISO8601( const QDateTime &dt ) 115QCString 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
127QDateTime TimeConversion::fromISO8601( const QCString &s ) 127QDateTime 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