I would like to find out what the start and end time of a specific day is expressed in UTC and in Python.
For instance:
- the current date and time is Sun 29 Oct 2023, 01:33:49 CEST (Central European Summer Time),
- the day starts at Sun 29 Oct 2023, 00:00:00 CEST,
- the day ends at Sun 29 Oct 2023, 23:59:59 CET (NB, the time zone switched from CEST (daylight saving time) to CET (not on daylight saving time))
Now I would like to get these times in UTC:
- Start: Sat 28 Oct 2023, 22:00:00 UTC
- End: Sun 29 Oct 2023, 22:59:59 UTC (the day contains 25 hours)
I do not want to set the timezone programatically - I want to get it from my system.
I find this easy to do in Swift as every date is timezone aware, but I can't get my head around on how to do this in Python. The reason why I need to do this is because I want to get all the data within a specific (local) day from my database, which contains UTC timestamps.
I've tried this:
from datetime import datetime, time
import pytz
start_of_day = datetime.combine(datetime.now(), time.min)
end_of_day = datetime.combine(datetime.now(), time.max)
print(start_of_day)
print(end_of_day)
print(start_of_day.astimezone().tzinfo)
print(end_of_day.astimezone().tzinfo)
start_of_day = pytz.utc.localize(start_of_day)
end_of_day = pytz.utc.localize(end_of_day)
print(start_of_day)
print(end_of_day)
print(start_of_day.astimezone().tzinfo)
print(end_of_day.astimezone().tzinfo)
which gives the following output:
2023-10-29 00:00:00
2023-10-29 23:59:59.999999
BST
GMT
2023-10-29 00:00:00+00:00
2023-10-29 23:59:59.999999+00:00
BST
GMT
while I would expect, something like (I guess UTC might also be GMT):
2023-10-29 00:00:00
2023-10-29 23:59:59.999999
CEST
CET
2023-10-28 22:00:00+00:00
2023-10-29 22:59:59.999999+00:00
UTC
UTC
Not only are the times wrong, but the timezones are also weird.
pytz's
localizejust sets the time zone, it doesn't convert likeastimezonedoes.Here's a slightly modified version of your code. We can use the standard lib datetime.timezone.utc to set UTC, to make things a bit clearer (pytz is deprecated since Python 3.9 btw.). See also comments in the code for some explanation.
On my system that is configured to use time zone "Europe/Berlin" the output is