As stated in the pytz documentation :
Unfortunately, using the tzinfo argument of standard datetime 'constructors does not work with pytz for many time zones.
Indeed, this is not the expected result, the time zone is incorrect:
>>> datetime(2013, 12, 27, 20, 0, 0, tzinfo=timezone('Europe/Bucharest')) datetime.datetime(2013, 12, 27, 20, 0, tzinfo=<DstTzInfo 'Europe/Bucharest' BMT+1:44:00 STD>)
It is explained that the pytz constructor specified by the timezone('Europe/Bucharest') does not check when the timezone offset should be taken into account, and these things change over time. pytz simply uses a previously known definition, which is often incorrect:
>>> timezone('Europe/Bucharest') <DstTzInfo 'Europe/Bucharest' BMT+1:44:00 STD>
It seems that this time zone was used until 1931 .
There is no such problem when working with UTC and converting using astimezone (for display only in accordance with the recommendations):
>>> datetime(2013, 12, 27, 20, 0, 0, tzinfo=pytz.utc)\ .astimezone(timezone('Europe/Bucharest')) datetime.datetime(2013, 12, 27, 22, 0, tzinfo=<DstTzInfo 'Europe/Bucharest' EET+2:00:00 STD>)
Then you will get the expected result:
>>> datetime(2013, 12, 27, 20, 0, 0, tzinfo=pytz.utc)\ .astimezone(timezone('Europe/Bucharest'))\ .astimezone(timezone('Europe/Berlin'))\ .replace(tzinfo=None) datetime.datetime(2013, 12, 27, 21, 0)