【已解决】更新用户,日期和时间戳的转化
来源: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)这个东西,大概就定位到问题了。
032021-11-26
相似问题
用户服务中的“创建用户”处理异常的方式
回答 1
新零售系统里的商家,店铺,用户之间的关系
回答 1