python timedelta转成int_timedelta转换为time或int并将其存储在gae(python)数据存储中

如果你打算把它作为

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年的完整范围。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值