Fix TZ handling in wxDateTime::ParseRfc822Date().

When the TZ offset specified in the RFC 822 string was equal to the local TZ
offset but the date fell in the DST period, the result was one hour off.

Fix this by converting the date to the UTC explicitly, and then converting it
back to the local TZ to ensure that the DST is taken into effect.

See #15370.
This commit is contained in:
Vadim Zeitlin
2015-02-26 00:55:33 +01:00
parent 7ffa1c4d3a
commit c477605bda
2 changed files with 9 additions and 1 deletions

View File

@@ -580,6 +580,7 @@ Major new features in this release
Unix:
- Fix wxIPaddress::Hostname() failing if /etc/hosts contained very long names.
- Fix wxDateTime::ParseRfc822Date() for some TZ/DST combinations.
All (GUI):

View File

@@ -996,7 +996,14 @@ wxDateTime::ParseRfc822Date(const wxString& date, wxString::const_iterator *end)
// the spec was correct, construct the date from the values we found
Set(day, mon, year, hour, min, sec);
MakeFromTimezone(TimeZone::Make(offset*SEC_PER_MIN));
// As always, dealing with the time zone is the most interesting part: we
// can't just use MakeFromTimeZone() here because it wouldn't handle the
// DST correctly because the TZ specified in the string is DST-invariant
// and so we have to manually shift to the UTC first and then convert to
// the local TZ.
*this -= wxTimeSpan::Minutes(offset);
MakeFromUTC();
if ( end )
*end = p;