Почему 1 час неправильно?

Время 15:0x в Стокгольме (Европа). Но я ошибаюсь в локализованном времени на 1 час:

>>> datetime.datetime.now()
datetime.datetime(2015, 12, 17, 15, 2, 42, 633000)
>>> babel.dates.format_datetime(datetime.datetime.now(), 'full', tzinfo=pytz.timezone('Europe/Stockholm'),locale='en')
u'Thursday, December 17, 2015 at 4:02:49 PM Central European Standard Time'
>>>

В чем ошибка?


person Niklas R.    schedule 17.12.2015    source источник
comment
Почему минус? Я очень старался правильно подобрать время.   -  person Niklas R.    schedule 17.12.2015
comment
часовой пояс, очевидно... почти каждый раз, когда вы получаете ожидаемую дату ровно на 1 час (или несколько часов), это будет связано с часовым поясом.   -  person Marc B    schedule 17.12.2015
comment
@MarcB Да и как? Я явно устанавливал часовой пояс на Europe/ Stockholm.   -  person Niklas R.    schedule 17.12.2015
comment
Я почти уверен, что datetime.now() уже включает местное время. попробуйте datetime.utcnow(), который по умолчанию соответствует часовому поясу None docs.python.org /2/library/datetime.html#datetime.datetime.now   -  person Busturdust    schedule 17.12.2015
comment
но вы не сообщили системе, в каком часовом поясе находится ваша дата ввода, поэтому она предполагает что-то не так. вы указали TZ только для вывода.   -  person Marc B    schedule 17.12.2015
comment
@Busturdust, вот и все! Это работает: babel.dates.format_datetime(datetime.datetime.utcnow(), 'full', tzinfo=pytz.timezone('Europe/Stockholm'),locale='en')   -  person Niklas R.    schedule 17.12.2015
comment
Кроме того, вы можете указать часовой пояс в своем datetime.now: datetime.datetime.now(tz=pytz.timezone('Europe/Stockholm'))   -  person DainDwarf    schedule 17.12.2015
comment
другое решение могло бы состоять в том, чтобы передать явный timezoe вызову dateime.now()   -  person Busturdust    schedule 17.12.2015


Ответы (2)


Проблема, по-видимому, заключалась в испеченном местном времени вызова datetime.datetime.now(). Как упоминалось в комментариях, используйте datetime.datetime.utcnow() для независимого от часового пояса coordinated universal time или введите желаемую информацию о часовом поясе в вызов datetime datetime.datetime.now(tz=pytz.timezone('Europe/Stockholm'))

person Busturdust    schedule 17.12.2015
comment
Это решение, которое я использую сейчас. - person Niklas R.; 17.12.2015
comment
и все же как-то заминусовали :), наслаждайтесь, удачного программирования - person Busturdust; 17.12.2015
comment
@Busturdust отличный ответ! как мне использовать второй метод с моей переменной datetime вместо datetime.now? - person Shahriar Rahman Zahin; 23.02.2021
comment
если у вас есть переменная типа datetime, вы должны просто сделать переменную. - person Busturdust; 24.02.2021

Явное лучше неявного. Установите часовой пояс для now:

now = datetime.datetime.now(tz=pytz.timezone('Europe/Stockholm'))
person Mike Müller    schedule 17.12.2015
comment
Благодарю вас! Хорошо, что мы можем это осуществить. Выход довольно аккуратный. - person Niklas R.; 17.12.2015
comment
@ Programmer400: преимущество в том, что .now(tz) работает даже во время перехода на летнее время, когда местное время может быть неоднозначным. Если вам нужно сделать существующий наивный объект datetime осведомленным о часовом поясе, используйте tz.localize(dt, is_dst=None). - person jfs; 17.12.2015
comment
.now(tz) работает всегда. datetime(tzinfo=tz) НЕПРАВИЛЬНО, если только tz не является часовым поясом с фиксированным смещением. - person jfs; 17.12.2015
comment
@J.F.Sebastion: Спасибо за информацию. - person unutbu; 17.12.2015