Merge pull request #3819 from yandex/fix-tehran-time

Fix daylight saving time conversion if it was at midnight and clock was adjusted backwards.
This commit is contained in:
alexey-milovidov 2018-12-13 00:06:50 +03:00 committed by GitHub
commit 9eca78e764
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 29 additions and 11 deletions

View File

@ -0,0 +1,24 @@
1981-09-30 23:00:00
1981-09-30 23:05:00
1981-09-30 23:10:00
1981-09-30 23:15:00
1981-09-30 23:20:00
1981-09-30 23:25:00
1981-09-30 23:30:00
1981-09-30 23:35:00
1981-09-30 23:40:00
1981-09-30 23:45:00
1981-09-30 23:50:00
1981-09-30 23:55:00
2018-09-21 23:00:00
2018-09-21 23:05:00
2018-09-21 23:10:00
2018-09-21 23:15:00
2018-09-21 23:20:00
2018-09-21 23:25:00
2018-09-21 23:30:00
2018-09-21 23:35:00
2018-09-21 23:40:00
2018-09-21 23:45:00
2018-09-21 23:50:00
2018-09-21 23:55:00

View File

@ -0,0 +1,3 @@
-- concat with empty string to defeat injectiveness of toString assumption.
SELECT concat('', toString(toDateTime('1981-09-29 00:00:00', 'Europe/Moscow') + INTERVAL number * 300 SECOND)) AS k FROM numbers(10000) GROUP BY k HAVING count() > 1 ORDER BY k;
SELECT concat('', toString(toDateTime('2018-09-19 00:00:00', 'Asia/Tehran') + INTERVAL number * 300 SECOND)) AS k FROM numbers(1000) GROUP BY k HAVING count() > 1 ORDER BY k;

View File

@ -250,8 +250,7 @@ public:
time_t res = t - lut[index].date;
/// NOTE We doesn't support cases when time change result in switching to previous day.
/// Data is cleaned to avoid these cases, so no underflow occurs here.
/// Data is cleaned to avoid possibility of underflow.
if (res >= lut[index].time_at_offset_change)
res += lut[index].amount_of_offset_change;

View File

@ -114,15 +114,7 @@ DateLUTImpl::DateLUTImpl(const std::string & time_zone_)
lut[i - 1].time_at_offset_change = time_at_offset_change;
/* std::cerr << lut[i - 1].year << "-" << int(lut[i - 1].month) << "-" << int(lut[i - 1].day_of_month)
<< " offset was changed at " << lut[i - 1].time_at_offset_change << " for " << lut[i - 1].amount_of_offset_change << " seconds.\n";*/
/** We doesn't support cases when time change results in switching to previous day.
* As an example, it was a case in Moscow at years 1981..1983 on October 1:
* clock was adjusted one hour backwards exactly at midnight (that was lead to extra hour 23 of Sep 30th).
* We must clean data (and we will make it slightly incorrect) to avoid these cases.
* (In previous example, it will lead to extra hour 0 of Sep 30 instead.)
*/
/// We doesn't support cases when time change results in switching to previous day.
if (static_cast<int>(lut[i - 1].time_at_offset_change) + static_cast<int>(lut[i - 1].amount_of_offset_change) < 0)
lut[i - 1].time_at_offset_change = -lut[i - 1].amount_of_offset_change;
}