首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导致上奇怪的日期时间结果的代码

导致上奇怪的日期时间结果的代码
EN

Stack Overflow用户
提问于 2015-11-26 09:17:56
回答 2查看 343关注 0票数 0

我正在上运行一个使用datetime函数的python程序。它应该总是返回UTC时间,但它似乎间歇性地给出了一个不正确的时间。我不确定我的代码是否有错误,或者这是否是谷歌的问题。

为了获得本地时间(GMT +8:00),我运行以下函数:

代码语言:javascript
复制
def SGTOffset(obj=datetime.now()):
    if isinstance(obj, datetime):
        return obj + timedelta(hours=8)
    return SGTOffset(datetime.now())

在我的主要节目中:

代码语言:javascript
复制
today_date = commoncode.SGTOffset().date()
logging.debug('Today date: %s | Today datetime: %s' % (today_date.isoformat(), commoncode.SGTOffset().isoformat()))

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

代码语言:javascript
复制
[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

因此,谷歌善意地将日志日期时间格式化为我的地区(GMT +8),显示代码在01:00:03.287 (11月26日,GMT +8)上运行。此外,提供的时间戳25/Nov/2015:09:00:02 -0800也证实了这一点。所以代码是在UTC时间25/Nov/2015 17:00:02运行的。

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

这是相当灾难性的,因为我使用本地日期时间在我的程序的许多领域。这种情况也只是间歇性地发生,因为昨天,相同的代码运行并得到了以下日志:

代码语言:javascript
复制
[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

这是正确的!(谷歌的日志时间戳01:00:02.237SGTOffset() (即01:00:01)生成的时间相匹配)

我能知道我的程序出了什么问题吗,或者这是否是的问题?

谢谢你花时间阅读这个问题!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-26 12:21:58

问题在于代码。

Python在函数obj第一次定义时(当函数对象首次实例化时)存储参数SGTOffset()的默认值,而不是像我直觉地期望的那样在任何时候调用函数。因此,datetime值将反映GAE中实例的启动时间。

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

代码语言:javascript
复制
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之后,我找到了这个解决方案。

票数 3
EN

Stack Overflow用户

发布于 2015-11-26 14:14:50

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

  • obj不是一个好的变量名,因为它没有提供信息。
  • 不需要递归调用函数
  • 最好不要使用isinstance,因为is None为您提供了所需的功能,如果给出了其他实例类型,那么您的代码将无法工作。

以下是我的建议:

代码语言:javascript
复制
def SGTOffset(dt=None):
    if dt is None:
        dt = datetime.now()
    return dt + timedelta(hours=8)

或者如果你喜欢简洁:

代码语言:javascript
复制
def SGTOffset(dt=None):
    return (dt or datetime.now()) + timedelta(hours=8)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33934622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档