在 Google App Engine 上导致奇怪的日期时间结果的代码
Code resulting in weird datetime result on Google App Engine
我在 Google App Engine 上 运行ning 一个使用日期时间函数的 python 程序。它应该总是 return 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 请将日志日期时间格式化为我的语言环境(格林威治标准时间 +8),显示代码为 运行 01:00:03.287
(11 月 26 日,格林威治标准时间 +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.237
与 SGTOffset()
生成的时间相匹配,即 01:00:01
)
我能知道我的程序有什么问题吗,或者这是否是 Google App Engine 的问题?
感谢您花时间阅读这个问题!
问题出在代码上。
Python 在首次定义函数 SGTOffset()
时(当函数对象首次实例化时)存储参数 obj
的默认值,而不是每当函数正如我直觉所期望的那样被调用。因此,日期时间值将反映实例在 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()
会在需要时动态调用。
我在查看 后得出了这个解决方案。
我正在添加一个快速回答,为您提供建议,使您的代码更具可读性:
obj
不是一个好的变量名,因为它没有提供信息
- 不需要递归调用函数
- 最好不要使用
isinstance
,因为 is None
为您提供了所需的功能,如果无论如何给出其他实例类型,您的代码将无法运行。
这是我的建议:
def SGTOffset(dt=None):
if dt is None:
dt = datetime.now()
return dt + timedelta(hours=8)
或者如果您更喜欢简洁:
def SGTOffset(dt=None):
return (dt or datetime.now()) + timedelta(hours=8)
我在 Google App Engine 上 运行ning 一个使用日期时间函数的 python 程序。它应该总是 return 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 请将日志日期时间格式化为我的语言环境(格林威治标准时间 +8),显示代码为 运行 01:00:03.287
(11 月 26 日,格林威治标准时间 +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.237
与 SGTOffset()
生成的时间相匹配,即 01:00:01
)
我能知道我的程序有什么问题吗,或者这是否是 Google App Engine 的问题?
感谢您花时间阅读这个问题!
问题出在代码上。
Python 在首次定义函数 SGTOffset()
时(当函数对象首次实例化时)存储参数 obj
的默认值,而不是每当函数正如我直觉所期望的那样被调用。因此,日期时间值将反映实例在 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()
会在需要时动态调用。
我在查看
我正在添加一个快速回答,为您提供建议,使您的代码更具可读性:
obj
不是一个好的变量名,因为它没有提供信息- 不需要递归调用函数
- 最好不要使用
isinstance
,因为is None
为您提供了所需的功能,如果无论如何给出其他实例类型,您的代码将无法运行。
这是我的建议:
def SGTOffset(dt=None):
if dt is None:
dt = datetime.now()
return dt + timedelta(hours=8)
或者如果您更喜欢简洁:
def SGTOffset(dt=None):
return (dt or datetime.now()) + timedelta(hours=8)