【已解决】更新用户,日期和时间戳的转化

来源:23-13 更新用户

只是为了好玩

2021-11-20

测试代码:
文件位置:
test/user.py

import grpc
from user_srv.proto import user_pb2_grpc, user_pb2


class UserTest:
    def __init__(self):
        # 连接grpc服务器
        channel = grpc.insecure_channel("127.0.0.1:50051")
        self.stub = user_pb2_grpc.UserStub(channel)


    def update_user_by_id(self, id, nick_name, gender, birthday):
        rsp: user_pb2.UserInfoResponse = self.stub.UpdateUser(user_pb2.UpdateUserInfo(
            id=id,
            nickName=nick_name,
            gender=gender,
            birthDay=birthday
        ))
        # grpc 返回值是空类型

if __name__ == '__main__':
    user = UserTest()
    user.update_user_by_id(4, "keegan1to33333", "男", 18)

handler/user.py

import time
from datetime import date

import grpc

from loguru import logger
from peewee import DoesNotExist
from passlib.hash import pbkdf2_sha256
from google.protobuf import empty_pb2

from user_srv.model.models import User
from user_srv.proto import user_pb2, user_pb2_grpc


class UserServicer(user_pb2_grpc.UserServicer):
    def convert_user_to_rsp(self, user):
        """解决共用的代码块"""
        # 将user的model对象转化为message对象
        user_info_rsp = user_pb2.UserInfoResponse()
        user_info_rsp.id = user.id
        user_info_rsp.passWord = user.password
        user_info_rsp.mobile = user.mobile
        user_info_rsp.role = user.role

        if user.nick_name:
            user_info_rsp.nickName = user.nick_name
        if user.gender:
            user_info_rsp.gender = user.gender
        if user.birthday:
            user_info_rsp.birthDay = int(time.mktime(user.birthday.timetuple()))

        return user_info_rsp
        

    @logger.catch
    def UpdateUser(self, request: user_pb2.UpdateUserInfo, context):
        # 更新用户
        try:
            user = User.get(User.id == request.id)

            user.nick_name = request.nickName
            user.gender = request.gender
            user.birthday = date.fromtimestamp(request.birthDay)
            user.save()
            return empty_pb2.Empty()
        except DoesNotExist as e:
            context.set_code(grpc.StatusCode.NOT_FOUND)
            context.set_details("用户不存在")
            return user_pb2.UserInfoResponse()

图片描述
这个birthday应该怎么传递呢?
研究了一下
date.fromtimestamp

from datetime import date
# 将时间戳转化为指定的日期
timestamp = date.fromtimestamp(1576244364)
print(timestamp) # 2019-12-13
# 指定的日期转时间戳
dt = "1998-10-24"
birthday = int(time.mktime(time.strptime(dt, "%Y-%m-%d")))
print(birthday) # 909158400


uint64

/*
uint32类型大小为 4 字节,32位,数据类型的值域 0 ~ 2的32次方 - 1 即 0 ~ 4294967295
uint64类型大小为 8 字节,64位,数据类型的值域 0 ~ 2的64次方 - 1 即 0 ~ 18446744073709551615
*/
/*
如果是有符号的整型,那么:
int32: -2147483648 ~ 2147483647
int64: -9223372036854775808 ~ 9223372036854775807
*/
/*
注意一个问题:大数可能会发生整型溢出。【现在内存够大,应该不大会发生这个问题】
*/

代码样例,

然后这样写:
test/user.py部分代码:

user.update_user_by_id(4, "keegan1to33333", "男",1576244364)

图片描述
就知道怎么解决了。
这么做,将指定格式的日期先转化为时间戳,作为birthday的参数即可。
这样改就行了:
test/user.py部分代码:

user.update_user_by_id(4, "keegan1to33333", "男", "1998-10-24")

test/user.py部分代码:

    def update_user_by_id(self, id, nick_name, gender, dt):
        # 将指定的日期转时间戳。因为birthDay是uint64的类型
        birthday = int(time.mktime(time.strptime(dt, "%Y-%m-%d")))
        rsp: user_pb2.UserInfoResponse = self.stub.UpdateUser(user_pb2.UpdateUserInfo(
            id=id,
            nickName=nick_name,
            gender=gender,
            birthDay=birthday
        ))
        # grpc 返回值是空类型

图片描述
自己写就会出现问题,不过我知道怎么解决它。【先认识问题,理解问题,再想解决方法,最后代码验证】

写回答

1回答

只是为了好玩

提问者

2021-11-20

主要是看到date.fromtimestamp(request.birthDay)这个东西,大概就定位到问题了。

0
3
bobby
回复
只是为了好玩
加油。。
2021-11-26
共3条回复

Go+Python打造电商系统 自研微服务框架 抓紧高薪机遇

快速转型Go工程师,成为具备双语言后端能力的开发者

508 学习 · 530 问题

查看课程