Search code examples
pythonherokutimezonepytz

datetime.now in python different when running locally and on server


I am using Heroku to run some python code.

The code that i have written uses a predefined time like example: 16:00 and compares that with the current time and the calculates the difference like this:

now = datetime.datetime.now()
starttime = datetime.datetime.combine(datetime.date.today(), datetime.time(int(hour), int(minute)))
dif = now - starttime

Running this locally ofc uses the time in my system i guess and everything is correct. However when i post it on the server and run it there the time is one hour back. So how can i fix this so it always uses the timezone that i am in?

I live in Sweden

Thank you all, Code examples would be deeply appreciated.

EDIT1

Rest of the code looks like this:

if dif < datetime.timedelta(seconds=0):
    hmm = 3                                     
elif dif < datetime.timedelta(seconds=45*60):
    t = dif.total_seconds() / 60
    time, trash = str(t).split(".")
    time = time+"'"
elif dif < datetime.timedelta(seconds=48*60):
    time = "45'"
elif dif < datetime.timedelta(seconds=58*60):
    time = "HT"
elif dif < datetime.timedelta(seconds=103*60):
    t = (dif.total_seconds() - 840) / 60
    time, trash = str(t).split(".")
    time = time+"'"
elif dif < datetime.timedelta(seconds=108*60):
    time = "90'"
else:
    time = "FT"

and using the imports that you provided i get this error now:

AttributeError: type object 'datetime.datetime' has no attribute 'timedelta'

i tried to do like this but it did not help:

from datetime import datetime, time, timedelta

Solution

  • So how can i fix this so it always uses the timezone that i am in?

    Find your timezone in the tz database e.g., using tzlocal module. Run on your local machine:

    #!/usr/bin/env python
    import tzlocal # $ pip install tzlocal
    
    print(tzlocal.get_localzone().zone)
    

    If tzlocal has been capable to get the timezone id then you should see something like: Europe/Paris. Pass this string to the server.

    On the server:

    #!/usr/bin/env python
    from datetime import datetime, time
    import pytz # $ pip install pytz
    
    tz = pytz.timezone('Europe/Paris') # <- put your local timezone here
    now = datetime.now(tz) # the current time in your local timezone
    naive_starttime = datetime.combine(now, time(int(hour), int(minute)))
    starttime = tz.localize(naive_starttime, is_dst=None) # make it aware
    dif = now - starttime