2011-03-03 81 views
4

我正在使用Google App Engine和python。我无法安装第三方库。在Python中使用时区获取当前时间?

我虽然这应该工作,但它实际上运行没有错误,但它返回当前时间时区不适用。

我做错了什么?

from datetime import tzinfo, timedelta, datetime 

class Seoul_tzinfo(tzinfo): 
    def utcoffset(self, dt): 
     return timedelta(hours=9) 
    def dst(self, dt): 
     return timedelta(0) 

greeting.date = datetime.now(Seoul_tzinfo()) 
+0

你的意思是 “无时区?”。如果只是名称,请尝试定义一个tzname方法。 – 2011-03-03 13:03:55

+0

@Thomas,我的意思是我得到当前时间GMT + 9不适用。 – SeniorLee 2011-03-03 13:22:16

+0

您可以在谷歌应用程序引擎上安装第三方库...但是,我说不知道pytz或dateutil(这是你需要什么)的工作。 – 2011-03-04 10:01:10

回答

3

你在说什么时候从数据库中获取实体?如果是这样,appengine以UTC存储所有dt属性;当你把(),它只是丢弃tz信息。最明智的做法是将dt转换为UTC(使用astimezone()),并在从数据存储中获取时转换回来。

(见http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#DateTimeProperty

+0

我想这就是它!我已经多次阅读文档,但我错过了一行。我一直试图将本地时间保存到数据库,并在获取数据后立即显示值。我会在取数据后尝试改变时间。谢谢! – SeniorLee 2011-03-04 10:22:49

3

您需要实施一个tzinfo类与所有适当的方法来做你想做的事情。

documentationtzinfo是一个抽象类,如果用datetime对象使用需要作出一个具体的类与适当的方法。

具体来看看这个从文档:

class FixedOffset(tzinfo): 
    """Fixed offset in minutes east from UTC.""" 

    def __init__(self, offset, name): 
     self.__offset = timedelta(minutes = offset) 
     self.__name = name 

    def utcoffset(self, dt): 
     return self.__offset 

    def tzname(self, dt): 
     return self.__name 

    def dst(self, dt): 
     return ZERO
+0

我不认为__init__&tzname方法是纯粹的方法。意味着这些方法没有必要实施。像@ qor72一样,我的示例代码工作正常。感谢您的建议,但。 – SeniorLee 2011-03-04 10:19:19

1

我运行的Python 2.6.5和你的代码似乎正常工作。我调整它来输出我的本地时间和你的时间调整;

$ python test.py 
Local: 2011-03-03 08:53:43.514784 
Adj: 2011-03-03 22:53:43.514784+09:00 

你确定这不是你的问候类吗?

+0

谢谢。我只是python的新手。这真的有助于缩小我的问题! – SeniorLee 2011-03-04 10:20:19