我有API
,看起来像
/summary/yyyy/mm
days_left: 9
和2013
的{{1}}和服务器上的当前日期为10
我如何计算剩余天数?
这是在python中实现的
21 Oct 2013
问题?
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在客户端,这是不正确的。正确?我该如何处理这种情况?
答案 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点。这仅适用于您的客户都在类似的时区,而您的活动不是全天候的;如果你在中国有客户,你可能会后悔这个选择。