B.2. ÐбÑабоÑка недопÑÑÑимÑÑ Ð¸Ð»Ð¸ неоднознаÑнÑÑ Ð·Ð½Ð°Ñений даÑÑ/вÑемени #
ÐбÑÑно, еÑли ÑÑÑока даÑÑ/вÑемени ÑинÑакÑиÑеÑки коÑÑекÑна, но ÑодеÑÐ¶Ð¸Ñ Ð¿Ð¾Ð»Ñ Ñо знаÑениÑми вне допÑÑÑимого диапазона, вÑдаÑÑÑÑ Ð¾Ñибка. ÐапÑимеÑ, не бÑÐ´ÐµÑ Ð¿ÑинÑÑа ÑÑÑока Ñ ÑиÑлом 31 ÑевÑалÑ.
Ðднако Ñ ÑÑÑÑом пеÑевода ÑаÑов на леÑнее вÑÐµÐ¼Ñ Ð²Ð¸Ð·ÑалÑно коÑÑекÑÐ½Ð°Ñ ÑÑÑока Ñ Ð´Ð°Ñой/вÑеменем Ð¼Ð¾Ð¶ÐµÑ ÑказÑваÑÑ Ð½Ðµ неÑÑÑеÑÑвÑÑÑий или неоднознаÑнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени. Такие знаÑÐµÐ½Ð¸Ñ Ñем не менее пÑинимаÑÑÑÑ; Ð´Ð»Ñ ÑазÑеÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑноÑÑи ÑÑиÑÑваеÑÑÑ ÑмеÑение Ð¾Ñ UTC. ÐапÑимеÑ, в пÑедположении, ÑÑо знаÑение TimeZone â America/New_York, ÑаÑÑмоÑÑиÑе ÑледÑÑÑий пÑимеÑ:
=> SELECT '2018-03-11 02:30'::timestamptz;
timestamptz
------------------------
2018-03-11 03:30:00-04
(1 row)Так как в ÑÑÐ¾Ñ Ð´ÐµÐ½Ñ Ð² данном ÑаÑовом поÑÑе ÑÑÑелки ÑаÑов пеÑеводилиÑÑ Ð²Ð¿ÐµÑÑд, по гÑажданÑким ÑаÑам не ÑÑÑеÑÑвовал Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени 2:30; они пеÑеÑкоÑили Ñ 2:00 (EST) на 3:00 (EDT). Postgres Pro воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ вÑемÑ, как еÑли Ð±Ñ Ð¾Ð½Ð¾ бÑло ÑÑандаÑÑнÑм вÑеменем (в ÑаÑовом поÑÑе UTC-5), в ÑезÑлÑÑаÑе Ñего оно пÑеобÑазÑеÑÑÑ Ð² 3:30AM (в ÑаÑовом поÑÑе EDT или UTC-4).
РнаобоÑоÑ, ÑаÑÑмоÑÑиÑе поведение в ÑлÑÑае пеÑевода вÑемени назад:
=> SELECT '2018-11-04 01:30'::timestamptz;
timestamptz
------------------------
2018-11-04 01:30:00-05
(1 row)Ð ÑÑÐ¾Ñ Ð´ÐµÐ½Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð´Ð²Ðµ инÑеÑпÑеÑаÑии вÑемени 1:30; ÑнаÑала бÑло 1:30 в ÑаÑовом поÑÑе EDT, а ÑÐ°Ñ ÑпÑÑÑÑ, поÑле пеÑевода ÑаÑов назад Ñ 2:00 на 1:00 и ÑÐ¼ÐµÐ½Ñ ÑаÑового поÑÑа Ñ EDT на EST, наÑÑÑпило 1:30 в ÑаÑовом поÑÑе EST. Так же и в ÑÑом ÑлÑÑае Postgres Pro инÑеÑпÑеÑиÑÑÐµÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ вÑемÑ, как еÑли Ð±Ñ Ð¾Ð½Ð¾ бÑло ÑÑандаÑÑнÑм (UTC-5). ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ вÑбÑаÑÑ Ð´ÑÑгой моменÑ, Ñказав ÑаÑовой поÑÑ Ð»ÐµÑнего вÑемени:
=> SELECT '2018-11-04 01:30 EDT'::timestamptz;
timestamptz
------------------------
2018-11-04 01:30:00-04
(1 row)ТоÑное пÑавило, пÑименÑемое в ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ , звÑÑÐ¸Ñ Ñак: неÑÑÑеÑÑвÑÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени, попадаÑÑий в инÑеÑвал пеÑевода ÑаÑов впеÑÑд, пÑивÑзÑваеÑÑÑ Ðº ÑмеÑÐµÐ½Ð¸Ñ Ð¾Ñ UTC, дейÑÑвовавÑÐµÐ¼Ñ Ð² данном ÑаÑовом поÑÑе до пеÑевода, а неоднознаÑнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени, попадаÑÑий в оба инÑеÑвала пÑи пеÑеводе ÑаÑов назад, пÑивÑзÑваеÑÑÑ Ðº ÑмеÑÐµÐ½Ð¸Ñ Ð¾Ñ UTC, дейÑÑвÑÑÑÐµÐ¼Ñ Ð¿Ð¾Ñле пеÑевода. ÐÐ»Ñ Ð±Ð¾Ð»ÑÑинÑÑва ÑаÑовÑÑ Ð¿Ð¾ÑÑов ÑÑо ÑавноÑилÑно пÑÐ°Ð²Ð¸Ð»Ñ Â«Ð² ÑлÑÑае неÑÑноÑÑи пÑедпоÑиÑаÑÑ Ð¸Ð½ÑеÑпÑеÑаÑÐ¸Ñ Ñо ÑÑандаÑÑнÑм вÑеменем».
РлÑбом ÑлÑÑае ÑмеÑение Ð¾Ñ UTC, ÑвÑзанное Ñ Ð¼ÐµÑкой вÑемени, можно задаÑÑ Ñвно, добавив либо ÑиÑловое ÑмеÑение, либо аббÑевиаÑÑÑÑ ÑаÑового поÑÑа, коÑоÑой ÑооÑвеÑÑÑвÑÐµÑ Ð½ÐµÐºÐ¾ÑоÑое ÑикÑиÑованное ÑмеÑение. ÐÑÑепÑиведÑнное пÑавило пÑименÑеÑÑÑ, ÑолÑко когда Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ вÑÑиÑлиÑÑ ÑмеÑение Ð¾Ñ UTC Ð´Ð»Ñ ÑаÑового поÑÑа, в коÑоÑом оно менÑеÑÑÑ.