10

Can someone explain me why I do not get the same result in those?

import datetime,pytz
var1 = datetime.datetime(2017,10,25,20,10,50,tzinfo=pytz.timezone("Europe/Athens")))
print(var1)

The output of this code is: 2017-10-25 20:10:50+01:35

import datetime,pytz
var1 = datetime.datetime(2017,10,25,20,10,50)
var1 = pytz.timezone("Europe/Athens").localize(var1)
print(var1)

The output of this code is: 2017-10-25 20:10:50+03:00

My question is why they have different timezones (1:35 and 3:00). I know that the second code is true because my UTC is 3:00. But can you tell me why I am getting 1:35 in the first one?

MSeifert
  • 145,886
  • 38
  • 333
  • 352
Kwnstantinos Nikoloutsos
  • 1,832
  • 4
  • 18
  • 34
  • You are calling `localize` in your second example and not in the first one. Given that I would expect differences, especially given the doc of `pytz`: *This library only supports two ways of building a localized time. The first is to use the `localize()`[...]The second way of building a localized time is by converting an existing localized time using the standard `astimezone()`* – Adonis Aug 18 '17 at 11:24
  • @KwnstantinosNikoloutsos Once you have found an answer which works for you, please click the tick next to that answer to accept it. This lets other people with your problem know which solution worked for you. – Adi219 Aug 18 '17 at 11:27
  • 1
    @AdiC Okay,just waiting for more people to see this and write in order to solve the issue I am facing. – Kwnstantinos Nikoloutsos Aug 18 '17 at 12:19
  • likely a duplicate of [Weird timezone issue with pytz](https://stackoverflow.com/q/11473721/10197418) – FObersteiner Jul 01 '22 at 07:51

3 Answers3

4

There is no problem, datetime just happily reports the offset of the tzinfo in whatever reference frame.

By default pytz.timezone doesn't give the UTC offset but the LMT (local mean time) offset:

>>> pytz.timezone("Europe/Athens")
<DstTzInfo 'Europe/Athens' LMT+1:35:00 STD>
#                          ^^^-------------------- local mean time

However when you localize it:

>>> var1 = datetime.datetime(2017,10,25,20,10,50)
>>> var1 = pytz.timezone("Europe/Athens").localize(var1)
>>> var1.tzinfo
<DstTzInfo 'Europe/Athens' EEST+3:00:00 DST>
#                          ^^^^-------------------- eastern european summer time

A different offset is now reported, this time based on the EEST.

MSeifert
  • 145,886
  • 38
  • 333
  • 352
3

tzinfo doesn't work well for some timezones and that could be the reason for the wrong result.
pytz doc:

Unfortunately using the tzinfo argument of the standard datetime constructors ‘’does not work’’ with pytz for many timezones.

Using localize or astimezone is a fix to this problem. Doc says that The preferred way of dealing with times is to always work in UTC, converting to localtime only when generating output to be read by humans.

import datetime, pytz
localTimezone = pytz.timezone('Europe/Athens')
var1 = datetime.datetime(2017,10,25,20,10,50,tzinfo=pytz.utc) 
loc_dt = var1.astimezone(localTimezone)
fmt = '%Y-%m-%d %H:%M:%S %Z%z'
print(loc_dt.strftime(fmt))  

This will print

2017-10-25 23:10:50 EEST+0300
haccks
  • 104,019
  • 25
  • 176
  • 264
1

In the second code, you use .localize(), which takes a naive datetime object and interprets it as if it is in that timezone. It does not move the time to another timezone. A naive datetime object has no timezone information to be able to make that move possible.

As you are making the time local in the second code, the time shown in the second one is correct. As you are not making the time local in the first code, the time shown is incorrect.

Adi219
  • 4,712
  • 2
  • 20
  • 43