如果你打算把它作为
datetime
(我同意这是个好主意),我会延长
DateTimeProperty
-然后您可以免费获得各种各样的解析和验证。
另外,存储为
timedelta
作为一个
日期时间
可以比这里给出的其他方法简单得多,方法是将其存储为与引用日期时间相距一定距离的日期时间,以便差异表示时间增量。这真的很容易,这要感谢datetime模块给我们的操作符重载。
from datetime import datetime, timedelta
from google.appengine.ext import db
class TimeDeltaProperty(db.DateTimeProperty):
# Use a reference datetime half way between the min and max possible
# datetimes, so that we can support both +ve and -ve timedeltas
ref_datetime = (datetime.max - datetime.min) / 2 + datetime.min
def get_value_for_datastore(self, model_instance):
# Get the timedelta instance assigned to this property
td = super(TimeDeltaProperty, self).get_value_for_datastore(model_instance)
if td is not None:
# datetime + timedelta = datetime
return self.ref_datetime + td
def make_value_from_datastore(self, dt):
if dt is not None:
# datetime - datetime = timedelta
return dt - self.ref_datetime
这里有一个等价的实现
NDB API
,如果你有这种倾向:
from datetime import datetime, timedelta
from google.appengine.ext import ndb
class TimeDeltaProperty(ndb.DateTimeProperty):
# Use a reference datetime half way between the min and max possible
# datetimes, so that we can support both +ve and -ve timedeltas
ref_datetime = (datetime.max - datetime.min) / 2 + datetime.min
def _validate(self, value):
if not isinstance(value, timedelta):
raise TypeError('expected a datetime.timedelta, got %r' % value)
def _to_base_type(self, value):
# datetime + timedelta = datetime
return self.ref_datetime + td
def _from_base_type(self, value):
# datetime - datetime = timedelta
return dt - self.ref_datetime
准确度
一
时间增量
在python中,可以处理大约+270万年的增量。然而,A
日期时间
只有10000年的历史。要在datetime中存储更大的timedelta,必须进行一些移位并牺牲一些准确性。
由于参考日期时间的选择,上面的方法将时间增量限制在这个范围的一半-大约为+/-5000年。
如果你知道你的时间增量总是正的,你可以使用
ref_datetime = datetime.min
(或者如果你知道它总是消极的,你可以使用
ref_datetime = datetime.max
)得到大约10000年的完整范围。