如何处理客户端和服务器之间的日期差异?

时间:2013-10-21 15:52:36

标签: python date timezone

我有API,看起来像

/summary/yyyy/mm
  • 返回所请求年份和月份的数据摘要。
  • 如果是当前年份和月份,则返回剩余天数的其中一项。例如:days_left: 92013的{​​{1}}和服务器上的当前日期为10

我如何计算剩余天数?
这是在python中实现的

21 Oct 2013

问题?

  • 服务器位于东海岸,客户端(我使用浏览器)位于太平洋时区
  • 当太平洋标准时间晚上9点在东海岸的时间发生变化时,如果我在PST上运行了def current_financial_month_details(self): time_from, time_to = self \ .get_start_end_time_current_financial_month() today = datetime.today() from_time = datetime(year=today.year, month=today.month, day=today.day) return { 'time_from': time_from, 'time_to': time_to, 'remaining_days': (time_to - from_time).days } ,如果它是/summary/2013/10,那么日期在EST上已经改变,所以{{1在客户端,这是不正确的。正确?

我该如何处理这种情况?

2 个答案:

答案 0 :(得分:3)

大多数人认为最佳做法是将日期和时间存储在与地理位置无关的时区中 - 最常见的是UTC。如果您要从具有不同时区的位置访问(或最终可以访问)服务,则同样适用。

正如J0HN所提到的,客户端的任务是在与服务器交互时从/转换为UTC。在您的情况下,这意味着days_left应定义为当前UTC日期与月末之间的天数(以UTC为单位)。

特别是对于python,有两种类型的datetime.datetime对象:naive and timezone-aware。天真的日期时间不会附加任何时区信息,因此一个好的做法(在联网程序中)只是在UTC时区中使用天真的日期时间。要进行计算(例如,减去两个日期),请考虑使用datetime.utcnow而不是datetime.now,以避免任何与时区相关的问题,包括(但不限于)由{{引起的错误时间增量3}}。

如果确实需要处理其他时区(例如,向用户显示),则可能需要使用外部库,因为python本身不提供时区数据库。 DST有更多相关信息。

答案 1 :(得分:1)

你有几个选择。

首先是指定结果传递的时区,并期望客户存在差异。明显的选择是服务器时区或UTC。

其次是让API也返回当前日期以及天数。它不会改变结果,但至少你能够发现日期与你期望的日期不同。

第三是让API采用时区输入,以便服务器可以调整其处理。

第四是使日期在午夜以外的某个时间更改,例如上午5点。这仅适用于您的客户都在类似的时区,而您的活动不是全天候的;如果你在中国有客户,你可能会后悔这个选择。