关于 django:Google App Engine、parsedatetime 和 TimeZones

Google App Engine, parsedatetime and TimeZones

我正在开发一个 Google App Engine / Django 应用,但遇到了以下问题:
在我的 html 中,我输入了时间。输入是自由文本——用户输入"1 小时内"或"明天上午 11 点"。然后将文本发送到 AJAX 中的服务器,该服务器使用以下 python 库对其进行解析:http://code.google.com/p/parsedatetime/。解析后,服务器返回时间的纪元时间戳。
这就是问题所在 - Google App Engine 始终在 UTC 上运行。因此,假设当地时间现在是上午 11 点,UTC 时间是凌晨 2 点。当我将"now"发送到服务器时,它将返回"2am",这很好,因为我希望以 UTC 时间接收日期。当我发送"1 小时内"时,服务器将再次返回"凌晨 3 点",这很好。但是,当我发送"中午"时,服务器将返回"中午 12 点",因为它认为我在谈论中午 UTC - 但实际上我需要它返回凌晨 3 点,这对于请求发送者来说是中午。我可以继续发送请求的浏览器的 TZ,但这不会真正帮助我 - parsedatetime 库不会接受时区参数(如果我错了,请纠正我)。这附近有散步吗?也许以某种方式设置环境 TZ?

谢谢!


您可以做的是使用 timedelta 对象添加差异 (http://docs.python.org/library/datetime.html)

偏移量

这里有一些(非常粗略的)代码给你一个想法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import parsedatetime
import datetime

my_users_timezone = whatever #replace this with a string that will make sense in the offsets dictionary

utc_timezone_offsets_in_hours = {
   'utc' : 0,
   'pacific' : -8,
   # etc
}

parsed_time = parsedatetime.whatever(input_string)
offset_hours = utc_utc_timezone_offsets_in_hours[my_users_timezone]
final_time = parsed_time + datetime.timedelta(hours=offset_hours)
return final_time


parsedatetime\\ 的解析例程需要一个 timetuple() 作为 sourceTime 参数,并且应该继承您包含在其中的任何时区信息,因为我不记得编写过任何覆盖它的代码。如果没有,那么它是一个错误,请告诉我。

您可以使用类似于上面的答案现在建议的代码,在 parse() 例程返回它确定的日期时间之后添加 TZ 偏移量:

1
2
3
4
5
6
7
import parsedatetime as pdt

cal = pdt.Calendar()

start  = datetime.datetime.now().timetuple()

parsed, flag = cal.parse('in 1 hr', start)

然后您可以取 parsedtimetuple 值并使用 timedelta 添加您的偏移小时数