datetime.now in python 在 运行 本地和服务器上不同
datetime.now in python different when running locally and on server
我正在使用 Heroku 运行 一些 python 代码。
我编写的代码使用了预定义的时间,例如:16:00 并将其与当前时间进行比较,并计算出这样的差异:
now = datetime.datetime.now()
starttime = datetime.datetime.combine(datetime.date.today(), datetime.time(int(hour), int(minute)))
dif = now - starttime
运行 这个本地 ofc 使用我系统中的时间,我猜一切都是正确的。但是,当我 post 它在服务器上并且 运行 它在那里时,时间倒退了一小时。那么我该如何解决这个问题,让它始终使用我所在的时区?
我住在瑞典
谢谢大家,代码示例将不胜感激。
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
那是因为服务器时间和你的时间不一样。例如,如果您在中国而服务器在美国。 datetime.now()
应该 returns 两者的时间不同。
datetime.datetime.now()
returns a "naive datatime object",因为与本地时间相关而不是时区。
因此,您应该在整个应用程序中使用时区,以创建 "time-zone-aware datetime object" 只是:
import pytz
from datetime import datetime
datetime.now(pytz.utc)
注意:我使用的是 UTC 时区,您可以随意使用。
So how can i fix this so it always uses the timezone that i am in?
在 tz 数据库中找到您的时区,例如,使用 tzlocal
module。 运行 在你的本地机器上:
#!/usr/bin/env python
import tzlocal # $ pip install tzlocal
print(tzlocal.get_localzone().zone)
如果 tzlocal
能够获取时区 ID,那么您应该会看到如下内容: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
我正在使用 Heroku 运行 一些 python 代码。
我编写的代码使用了预定义的时间,例如:16:00 并将其与当前时间进行比较,并计算出这样的差异:
now = datetime.datetime.now()
starttime = datetime.datetime.combine(datetime.date.today(), datetime.time(int(hour), int(minute)))
dif = now - starttime
运行 这个本地 ofc 使用我系统中的时间,我猜一切都是正确的。但是,当我 post 它在服务器上并且 运行 它在那里时,时间倒退了一小时。那么我该如何解决这个问题,让它始终使用我所在的时区?
我住在瑞典
谢谢大家,代码示例将不胜感激。
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
那是因为服务器时间和你的时间不一样。例如,如果您在中国而服务器在美国。 datetime.now()
应该 returns 两者的时间不同。
datetime.datetime.now()
returns a "naive datatime object",因为与本地时间相关而不是时区。
因此,您应该在整个应用程序中使用时区,以创建 "time-zone-aware datetime object" 只是:
import pytz
from datetime import datetime
datetime.now(pytz.utc)
注意:我使用的是 UTC 时区,您可以随意使用。
So how can i fix this so it always uses the timezone that i am in?
在 tz 数据库中找到您的时区,例如,使用 tzlocal
module。 运行 在你的本地机器上:
#!/usr/bin/env python
import tzlocal # $ pip install tzlocal
print(tzlocal.get_localzone().zone)
如果 tzlocal
能够获取时区 ID,那么您应该会看到如下内容: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