Почему это имеет значение, если я добавляю 1 час к времени UTC и локализую или 1 час к местному времени? - PullRequest
0 голосов
/ 21 мая 2018

Пример кода

from datetime import datetime, timezone, timedelta
import pytz

t11 = datetime(1918, 4, 15, 0, 0, tzinfo=timezone.utc).astimezone(pytz.timezone('Europe/Berlin'))
t12 = t11 + timedelta(hours=1)

t2 = datetime(1918, 4, 15, 1, 0, tzinfo=timezone.utc).astimezone(pytz.timezone('Europe/Berlin'))

print(t12)
print(t2)

Наблюдаемый

1918-04-15 02:00:00+01:00
1918-04-15 03:00:00+02:00

Ожидаемый

Я ожидал, что оба будут тем, что я вижу для t2.Принципиальное отличие - t2.hour против t12.hour.Для объекта datetime с учетом часового пояса я ожидал, что час будет местным часом.

Вопрос

Как я могу изменить это поведение?С чем это связано?

1 Ответ

0 голосов
/ 21 мая 2018

Я не приму следующее, потому что оно только объясняет, как это сделать правильно.Это не объясняет, почему добавление timedelta не работает ожидаемым образом.

Как это исправить

Этот ответ предлагает использовать следующий подход:

from datetime import datetime, timezone, timedelta
import pytz

# Timezone-aware object to start with
t11 = datetime(1918, 4, 15, 0, 0, tzinfo=timezone.utc).astimezone(pytz.timezone('Europe/Berlin'))

# Extract timezone information
tzinfo = t11.tzinfo

# Convert to UTC, add timedelta, convert to local timezone
t13 = (t11.astimezone(pytz.timezone('utc')) + timedelta(hours=1)).astimezone(tzinfo)

Еще один способ сделать это:

t14 = t11 + timedelta(hours=1)  # Invalid timezone!
t14 = t14.astimezone(pytz.utc).astimezone(t14.tzinfo)  # Fix the timezone

Теперь у меня есть:

t11: 1918-04-15 01:00:00+01:00
t13: 1918-04-15 03:00:00+02:00  # one hour more and +1h because of DST

Маятник

Пакет pendulum - это еще один способ исправить это:

from pendulum import datetime
from datetime import timedelta
import pytz

t11 = datetime(1918, 4, 15, 0, 0).astimezone(pytz.timezone('Europe/Berlin'))
t12 = t11 + timedelta(hours=1)

t2 = datetime(1918, 4, 15, 1, 0).astimezone(pytz.timezone('Europe/Berlin'))

дает:

t11: 1918-04-15T01:00:00+01:00
t12: 1918-04-15T03:00:00+02:00
t2 : 1918-04-15T03:00:00+02:00
...