2015-02-27 4 views
1

Я использую Heroku для запуска кода python.datetime.now в python разные при запуске локально и на сервере

код, который я написал использует предопределенное время, как, например: 16:00 и сравнивает его с текущим временем и вычисляют разницу так:

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

Запуск этого локально OFC использует время в моей системе, я думаю, и все правильно. Однако, когда я отправляю его на сервер и запускаю его там, время на один час назад. Итак, как я могу это исправить, поэтому он всегда использует часовой пояс, в котором я?

Я живу в Швеции

Спасибо всем, примеры кода будет глубоко признателен.

EDIT1

Остальной код выглядит следующим образом:

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" 

и использование импорта, что предоставленные вами я получаю эту ошибку прямо сейчас:

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

я пытался сделать как это, но это не помогло:

from datetime import datetime, time, timedelta 
+0

не связаны: вы можете использовать 'timedelta (мин = 103)' вместо 'timedelta (секунд = 103 * 60)' – jfs

+0

Спасибо :), хорошо знать –

ответ

3

Так как я могу исправить это, так что он всегда использует часовой пояс, в котором я?

Найдите свой часовой пояс в базе данных tz, используя tzlocal module. Запуск на локальном компьютере:

#!/usr/bin/env python 
import tzlocal # $ pip install tzlocal 

print(tzlocal.get_localzone().zone) 

Если tzlocal была способна получить часовой пояс идентификатор, то вы должны увидеть что-то вроде: Europe/Paris. Передайте эту строку на сервер.

На сервере:

#!/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 
+0

Благодарим вас за решение, в котором он работал нормально. Но это привело к ошибке, которую я представил на мой вопрос, связанный с моим вопросом. Пожалуйста, если вы знаете, как это исправить. @ J.F.Sebastian –

+0

@TimoCengiz: note: Я использую 'from datetime import datetime', в то время как ваш код ожидает' import datetime'. Используйте тот или иной, но не оба одновременно. Модуль и класс внутри модуля имеют одно и то же имя. Я знаю, что это сбивает с толку. Если вам нужно больше объяснений; задайте отдельный вопрос конкретно об импорте и ошибках атрибутов – jfs

+0

при использовании из даты и времени импорта datetime. На что будет изменен код? вот так ?: datetime.datetime.timedelta (....)? –

0

Это связано с тем, что время сервера отличается от вашего времени. Например, если вы находитесь в Китае, а сервер находится в США. datetime.now() должен возвращать другое время для обоих.

datetime.datetime.now() возвращает «наивный объект времени», потому что он связан с местным временем, а не часовым поясом.

Таким образом, вы должны работать с временной зоны в вашем приложении, чтобы создать «часовой пояс-Aware DATETIME объект» просто:

import pytz 
from datetime import datetime 
datetime.now(pytz.utc) 

Примечание: Я использую UTC часовой пояс, вы можете используйте то, что хотите.