Google App Engine中的有效日期时间对象

1 投票
1 回答
586 浏览
提问于 2025-04-16 07:01

在这个模型中

class Rep(db.Model):
    mAUTHOR = db.UserProperty(auto_current_user=True)
    mUNIQUE = db.StringProperty()
    mCOUNT = db.IntegerProperty()
    mDATE = db.DateTimeProperty(auto_now=True)
    mDATE0 = db.DateTimeProperty(auto_now_add=True)
    mWEIGHT = db.IntegerProperty()

我想要做的是:

mWEIGHT = mCOUNT / mDATE0

在这个循环里

    for i in range(len(UNIQUES)):                        
        C_QUERY = Rep.all()
        C_QUERY.filter("mAUTHOR =", user)
        C_QUERY.filter("mUNIQUE =", UNIQUES[i])
        C_RESULT = C_QUERY.fetch(1)                
        if C_RESULT:
            rep=C_RESULT[0]
            rep.mCOUNT+=COUNTS[i]
            # how to convert mDATE0 to integer so that I can divide:
            # rep.mWEIGHT = rep.mCOUNT / rep.mDATE0
            rep.put()
        else:
            C = COUNTS[i]
            S = UNIQUES[i]
            write_to_db(S, C)

我在其他几个论坛也问过同样的问题,得到了很多好的建议,但我还是搞不定这段代码,因为我对(对象、实例、datetime.datetime、秒、第二……等等)感到困惑。例如,我原以为

mWEIGHT = mCOUNT / rep.mDATE0.second

可以把mDATE0转换成秒;但实际上并没有,它只是取了2010-11-12 18:57:27.338000这个时间的秒部分,也就是27。

而且

mWEIGHT = mCOUNT / mDATE0.date

会出现类型不匹配的错误信息。

我还试过

rep.mWEIGHT = rep.mCOUNT / rep.mDATE0.toordinal()

这个方法会得到一个像734088这样的数字,但所有的项目都得到了相同的数字。

你也可以看看我在同一主题上的之前的问题

谢谢你的帮助。

编辑3

这个方法有效,谢谢!

if C_RESULT:
    rep = C_RESULT[0]
    rep.mCOUNT+=COUNTS[i]
    utc_tuple = rep.mDATE0.utctimetuple()
    # this is actually float not integer
    mDATE0_integer = time.mktime(utc_tuple)
    mDATE0_day = mDATE0_integer / 86400
    rep.mWEIGHT = float(rep.mCOUNT / mDATE0_day)
    rep.put()

编辑2

@Constantin:我意识到数字需要是浮点数:

>>> mCOUNT = 35
>>> div = mCOUNT / mDATE0
>>> div
0
>>> div = float(mCOUNT) / float(mDATE0)
>>> div
2.7140704010987625e-08
>>> 

我不太确定怎么把这个加到脚本里。有什么建议吗?

编辑

@Constantin:

对于这个项目

C_RESULT[0] = "new item"

这是我得到的结果。

new item: 
rep: <__main__.Rep object at 0x052186D0> 
mDATE0_integer: 1289575981 
rep.mCOUNT: 35 
rep.mWEIGHT: 0             

所以

mDATE0_integer = int(time.mktime(rep.mDATE0.utctimetuple()))

这个方法有效,并给出了整数1289575981,但这个除法

rep.mWEIGHT = rep.mCOUNT / mDATE0_integer

结果是0。有什么建议吗?

1 个回答

1

这个代码应该能满足你的需求:

import time
mWEIGHT = mCOUNT / time.mktime(mDATE0.utctimetuple())

可以查看 mktime 了解更多信息。

mCOUNT / mDATE0.date 这个写法不行,因为整数和日期之间没有除法运算符。

toordinal 这个方法也不适合你,因为它只处理日期,完全不考虑时间。

撰写回答