【问题标题】:datetime.now in python different when running locally and on serverpython中的datetime.now在本地和服务器上运行时不同
【发布时间】:2015-04-30 18:57:03
【问题描述】:

我正在使用 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 会占用我系统中的时间,而且一切都是正确的。但是,当我将它发布在服务器上并在那里运行时,时间是一小时前。那么我该如何解决这个问题,以便它始终使用我所在的时区?

我住在瑞典

谢谢大家,代码示例将不胜感激。

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

【问题讨论】:

  • 无关:您可以使用timedelta(minutes=103) 代替timedelta(seconds=103*60)

标签: python heroku timezone pytz


【解决方案1】:

那么我该如何解决这个问题,让它始终使用我所在的时区?

在 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

【讨论】:

  • 感谢您提供的解决方案,它运行良好。但这导致我向与我的问题相关的问题提供的错误。请如果您知道如何解决此问题.. @J.F.Sebastian
  • @TimoCengiz:注意:我使用from datetime import datetime,而您的代码需要import datetime。使用一种或另一种,但不能同时使用。模块和模块内的类同名。我知道这很令人困惑。如果您需要更多解释;单独问一个关于导入和属性错误的问题
  • 使用从日期时间导入日期时间时。代码会改成什么?像这样?:datetime.datetime.timedelta(....) ?
  • @TimoCengiz:这是一个非常基本的问题(可以有一个)。但是 cmets 不是详细解释的地方。见python “import datetime” v.s. “from datetime import datetime”
【解决方案2】:

这是由于服务器时间与您的时间不同。例如,如果您在中国并且服务器在美国。 datetime.now() 应该为两者返回不同的时间。

datetime.datetime.now() 返回一个“naive datatime object”,因为它与本地时间而不是时区有关。

因此,您应该在整个应用程序中使用时区,以创建一个“可识别时区的日期时间对象”

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

注意:我使用的是 UTC 时区,您可以随意使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多