Thread: BUG #15527: Issue converting from local date/time to 'timestamp withtime zone' prior to dst transition
BUG #15527: Issue converting from local date/time to 'timestamp withtime zone' prior to dst transition
From
PG Bug reporting form
Date:
The following bug has been logged on the website: Bug reference: 15527 Logged by: Michael Davidson Email address: packfan91@gmail.com PostgreSQL version: 9.6.10 Operating system: CentOS 6-9.el6.12.3 Description: We have an application that is storing time series data in postgres using 'timestamp with time zone' field. Both the operating system and postgres are configured using 'US/Eastern' time zone. No timezone is being provided in the date/time values being inserted. We noticed that on 11/4/2018 one hour worth of readings (from 1am to 2am US/Eastern) are missing. Due to the dst rules for 'US/Eastern' the UTC offset should transition from -04 to -05 on 11/4/2018 at 2am US/Eastern. However, please take a look at the output below. It looks to me as if postgres is changing the UTC offset from -04 to -05 at 1am instead of at 2am. I'm wondering if this is by design. raritan=# select now(); now ------------------------------ 2018-11-04 00:05:18.91363-04 (1 row) raritan=# SELECT * FROM pg_timezone_names where name = 'US/Eastern'; name | abbrev | utc_offset | is_dst ------------------+--------+------------+-------- US/Eastern | EDT | -04:00:00 | t (1 row) raritan=# select '2018-11-04 00:00:00'::timestamp with time zone; timestamptz ------------------------ 2018-11-04 00:00:00-04 (1 row) raritan=# select '2018-11-04 01:00:00'::timestamp with time zone; timestamptz ------------------------ 2018-11-04 01:00:00-05 <====== shouldn't this be -04 because still in daylight savings time? (1 row) I suspect that postgres doesn't take into account the current time and whether or not daylight savings time is currently in effect when converting to UTC. If that's the case there's no way to know if the date/time being inserted is 1am EDT (UTC -04) or 1am EST (UTC -05) Perhaps postgres just chose to go with the latter regardless of the current time. I looked at the documentation but didn't notice anything that specifically addressed this detail.
Re: BUG #15527: Issue converting from local date/time to 'timestamp with time zone' prior to dst transition
From
Tom Lane
Date:
=?utf-8?q?PG_Bug_reporting_form?= <noreply@postgresql.org> writes: > We have an application that is storing time series data in postgres using > 'timestamp with time zone' field. Both the operating system and postgres > are configured using 'US/Eastern' time zone. No timezone is being provided > in the date/time values being inserted. We noticed that on 11/4/2018 one > hour worth of readings (from 1am to 2am US/Eastern) are missing. Due to > the dst rules for 'US/Eastern' the UTC offset should transition from -04 to > -05 on 11/4/2018 at 2am US/Eastern. However, please take a look at the > output below. It looks to me as if postgres is changing the UTC offset from > -04 to -05 at 1am instead of at 2am. I'm wondering if this is by design. In a fall-back transition, civil times between 1am and 2am are ambiguous: they could refer to either the first transition between those hours (while still on DST) or the second transition (now on standard time). Postgres assumes that an unlabeled input time between those hours is to be read as standard time, which I'd agree is pretty arbitrary, but the other possibilities aren't better. > If that's the case there's no way to know if the date/time being > inserted is 1am EDT (UTC -04) or 1am EST (UTC -05) Well, yes, that's exactly the problem. It could be either. The only real way to fix this is to change your data entry procedure so that you specify a zone abbreviation or UTC offset when entering an ambiguous timestamp. Or you could set "timezone" to a non-DST-aware setting and be sure to change it at exactly the right time. > I looked at the documentation but didn't notice anything that > specifically addressed this detail. This behavior is pretty clearly documented in the source code: * It's an invalid or ambiguous time due to timezone transition. In a * spring-forward transition, prefer the "before" interpretation; in a * fall-back transition, prefer "after". (We used to define and implement * this test as "prefer the standard-time interpretation", but that rule * does not help to resolve the behavior when both times are reported as * standard time; which does happen, eg Europe/Moscow in Oct 2014. Also, * in some zones such as Europe/Dublin, there is widespread confusion * about which time offset is "standard" time, so it's fortunate that our * behavior doesn't depend on that.) but if this is mentioned anywhere in the SGML docs, I couldn't find it in a quick search :-(. We should improve that. regards, tom lane
Re: BUG #15527: Issue converting from local date/time to 'timestampwith time zone' prior to dst transition
From
Mike Davidson
Date:
On Nov 28, 2018, at 4:30 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote: > > =?utf-8?q?PG_Bug_reporting_form?= <noreply@postgresql.org> writes: >> We have an application that is storing time series data in postgres using >> 'timestamp with time zone' field. Both the operating system and postgres >> are configured using 'US/Eastern' time zone. No timezone is being provided >> in the date/time values being inserted. We noticed that on 11/4/2018 one >> hour worth of readings (from 1am to 2am US/Eastern) are missing. Due to >> the dst rules for 'US/Eastern' the UTC offset should transition from -04 to >> -05 on 11/4/2018 at 2am US/Eastern. However, please take a look at the >> output below. It looks to me as if postgres is changing the UTC offset from >> -04 to -05 at 1am instead of at 2am. I'm wondering if this is by design. > > In a fall-back transition, civil times between 1am and 2am are ambiguous: > they could refer to either the first transition between those hours > (while still on DST) or the second transition (now on standard time). > Postgres assumes that an unlabeled input time between those hours is > to be read as standard time, which I'd agree is pretty arbitrary, > but the other possibilities aren't better. > >> If that's the case there's no way to know if the date/time being >> inserted is 1am EDT (UTC -04) or 1am EST (UTC -05) > > Well, yes, that's exactly the problem. It could be either. The only > real way to fix this is to change your data entry procedure so that > you specify a zone abbreviation or UTC offset when entering an ambiguous > timestamp. Or you could set "timezone" to a non-DST-aware setting > and be sure to change it at exactly the right time. > >> I looked at the documentation but didn't notice anything that >> specifically addressed this detail. > > This behavior is pretty clearly documented in the source code: > > * It's an invalid or ambiguous time due to timezone transition. In a > * spring-forward transition, prefer the "before" interpretation; in a > * fall-back transition, prefer "after". (We used to define and implement > * this test as "prefer the standard-time interpretation", but that rule > * does not help to resolve the behavior when both times are reported as > * standard time; which does happen, eg Europe/Moscow in Oct 2014. Also, > * in some zones such as Europe/Dublin, there is widespread confusion > * about which time offset is "standard" time, so it's fortunate that our > * behavior doesn't depend on that.) > > but if this is mentioned anywhere in the SGML docs, I couldn't find it > in a quick search :-(. We should improve that. > > regards, tom lane Tom, Makes sense…thank you for the clarification. Best regards, Mike