代码导致G​​oogle App Engine产生奇怪的日期时间

时间:2015-11-26 09:17:57

标签: python google-app-engine datetime google-app-engine-python

我在Google App Engine上运行了一个使用日期时间功能的python程序。它应该始终返回UTC时间,但似乎间歇性地给出了不正确的时间。我不确定我的代码是否有错误,或者这是否是Google方面的问题。

要获取当地时间(GMT +8:00),我运行此功能:

def SGTOffset(obj=datetime.now()):
    if isinstance(obj, datetime):
        return obj + timedelta(hours=8)
    return SGTOffset(datetime.now())

在我的主程序中:

today_date = commoncode.SGTOffset().date()
logging.debug('Today date: %s | Today datetime: %s' % (today_date.isoformat(), commoncode.SGTOffset().isoformat()))

在日志中,我得到以下内容:

[25/Nov/2015:09:00:02 -0800] "GET ... etc ...
01:00:03.287     Today date: 2015-11-25 | Today datetime: 2015-11-25T15:38:20.804300

因此,Google将日志日期时间格式化为我的语言环境(GMT +8),显示代码运行在01:00:03.287(11月26日,GMT +8)。此外,这由所提供的时间戳25/Nov/2015:09:00:02 -0800确认。所以代码是在25/Nov/2015 17:00:02 UTC时间运行的。

但是,我的代码输出的时间不对。代码2015-11-25T15:38:20.804300中生成的日期时间的格式为GMT-9:30而不是UTC时间。 (因为SGToffset()将日期时间增加8小时)

由于我在程序的许多方面使用本地日期时间,因此这是非常灾难性的。这也只是间歇性地发生,因为昨天,相同的代码运行并得到了这个日志:

[24/Nov/2015:09:00:00 -0800] "GET ... etc ...
01:00:02.237     Today date: 2015-11-25 | Today datetime: 2015-11-25T01:00:01.768140

哪个是对的! (Google的日志时间戳01:00:02.237SGTOffset() 01:00:01生成的时间相匹配

我可以知道我的程序有什么问题,或者这是否是Google App Engine的问题?

感谢您花时间阅读此问题!

2 个答案:

答案 0 :(得分:3)

问题在于代码。

Python首次定义函数obj时存储参数SGTOffset()的默认值(当函数对象首次被实例化时),而不是在我直观地预期调用函数时。因此,datetime值将反映GAE中实例的开始时间。

为了在没有任何参数的情况下调用SGTOffset()时获取当前时间,我应该使用:

def SGTOffset(obj=None): # Instead of obj=datetime.now() which is converted to obj='specific datetime' when instantiated
    if isinstance(obj, datetime):
        return obj + timedelta(hours=8)
    return SGTOffset(datetime.now())

在这种情况下,只要需要,就会动态调用datetime.now()

我在查看a question about old datetime values being returned后找到了此解决方案。

答案 1 :(得分:1)

我正在添加一个快速回答,为您提供建议,使您的代码更具可读性:

  • document.location.href = 'https://www.ruralauditor.gr/csvExports/'+nodeId+'.zip'; 不是一个好的变量名,因为它没有提供信息
  • 无需递归调用函数
  • 最好不要使用obj,因为isinstance为您提供了所需的功能,如果给出其他实例类型,您的代码将无效。

这是我的建议:

is None

或者如果您更喜欢简洁:

def SGTOffset(dt=None):
    if dt is None:
        dt = datetime.now()
    return dt + timedelta(hours=8)