Index: trunk/mwdumper/mwimport/XmlDumpReader.cs |
— | — | @@ -122,11 +122,9 @@ |
123 | 123 | return ""; |
124 | 124 | } |
125 | 125 | while (_reader.Read()) { |
126 | | - //Console.WriteLine("XXX: " + reader.NodeType + ", " + reader.LocalName + ", " + reader.Value); |
127 | 126 | switch (_reader.NodeType) { |
128 | 127 | case XmlNodeType.SignificantWhitespace: |
129 | 128 | case XmlNodeType.Text: |
130 | | - _reader.MoveToContent(); |
131 | 129 | val.Append(_reader.Value); |
132 | 130 | break; |
133 | 131 | case XmlNodeType.EndElement: |
— | — | @@ -226,13 +224,7 @@ |
227 | 225 | } |
228 | 226 | |
229 | 227 | private void ReadTimestamp() { |
230 | | - // This is slow, took up 10% of runtime trying 17 different formats! |
231 | | - //_rev.Timestamp = XmlConvert.ToDateTime(ReadElementContent()).ToUniversalTime(); |
232 | | - |
233 | | - // We've declared a standard format, so just check it. |
234 | | - _rev.Timestamp = DateTime.ParseExact(ReadElementContent(), |
235 | | - @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", |
236 | | - System.Globalization.CultureInfo.CurrentCulture); |
| 228 | + _rev.Timestamp = ParseUTCTimestamp(ReadElementContent()); |
237 | 229 | } |
238 | 230 | |
239 | 231 | private void ReadComment() { |
— | — | @@ -273,5 +265,23 @@ |
274 | 266 | private void ReadIp() { |
275 | 267 | _contrib = new Contributor(ReadElementContent()); |
276 | 268 | } |
| 269 | + |
| 270 | + private DateTime ParseUTCTimestamp(string text) { |
| 271 | + // 2003-10-26T04:50:47Z |
| 272 | + // |
| 273 | + // We're doing this manually because: |
| 274 | + // * XmlConvert.ToDateTime() is slow |
| 275 | + // * XmlConvert.ToDateTime() is lossy at local DST boundary |
| 276 | + // * DateTime.ParseExact seems to be similarly lossy, unless |
| 277 | + // there's a magic formula I haven't found yet. |
| 278 | + string trimmed = text.Trim(); |
| 279 | + return new DateTime( |
| 280 | + int.Parse(trimmed.Substring(0,4)), // year |
| 281 | + int.Parse(trimmed.Substring(5,2)), // month |
| 282 | + int.Parse(trimmed.Substring(8,2)), // day |
| 283 | + int.Parse(trimmed.Substring(11,2)), // hour |
| 284 | + int.Parse(trimmed.Substring(14,2)), // minute |
| 285 | + int.Parse(trimmed.Substring(17,2))); // second |
| 286 | + } |
277 | 287 | } |
278 | 288 | } |