简介
我们之前介绍过使用pydantic
验证数据,比如校验数据的格式等,但是在我们的日常工作中,还有一种数据是需要我们验证的,比如时间数据,时间数据不同于字符串,列表等数据,与他们的验证不一样,本文就来为大家介绍一下pydantic
如何验证时间数据。
datetime时间类型处理
首先,datetime
有以下不同的数据:
- datetime, 现有datetime对象
- int或float,假定为 Unix 时间,即自 1970 年 1 月 1 日以来的秒数(if >= -2e10 or <= 2e10))或毫秒 (if < -2e10or > 2e10)
- str, 则类似:YYYY-MM-DD[T]HH:MM[:SS[.ffffff]][Z or [±]HH[:]MM]]]int或float作为字符串(假定为 Unix 时间)
处理datetime
数据,代码如下:
from datetime import datetime
from pydantic import BaseModel, validator
class Book(BaseModel):
id: int
name: str
create_time: datetime = None
@validator('create_time', pre=True, always=True)
def set_create_now(cls, v):
return v or datetime.now()
# 1.传datetime 对象
book1 = Book(id=1, name='muller', create_time=datetime.now())
print(book1.json())
# 2.传字符串
book2 = Book(id=2, name='theshy', create_time="2023-10-24T12:00:10.707257")
print(book2.json())
# 3.Unix 时间戳
book2 = Book(id=3, name='langx', create_time=1645506606260)
print(book2.json())
-----------
输出结果如下:
{"id": 1, "name": "muller", "create_time": "2023-10-25T14:36:27.550312"}
{"id": 2, "name": "theshy", "create_time": "2023-10-24T12:00:10.707257"}
{"id": 3, "name": "langx", "create_time": "2022-02-22T05:10:06.260000+00:00"}
date 日期类型
date日期数据类型可能是以下类型:
- date, 现有date对象
- int或float,见datetime Unix 时间
- str, 有效格式:YYYY-MM-DD int或float
处理date
日期数据类型,代码如下:
from datetime import datetime, date
from pydantic import BaseModel, validator
class Book(BaseModel):
id: int
name: str
create_time: date = None
@validator('create_time', pre=True, always=True)
def set_create_now(cls, v):
return v or date.today()
# 1.传date 对象
book1 = Book(id=1, name='python', create_time=date.today())
print(book1.json())
# 2.传字符串
book2 = Book(id=2, name='python', create_time="2023-10-01")
print(book2.json())
# 3.Unix 时间戳
book2 = Book(id=3, name='python', create_time=1645506606260)
print(book2.json())
-----------------
输出结果如下:
{"id": 1, "name": "python", "create_time": "2023-10-25"}
{"id": 2, "name": "python", "create_time": "2023-10-01"}
{"id": 3, "name": "python", "create_time": "2022-02-22"}
time时间点处理
time
字段可以是:
- time, 现有time对象
- str, 以下格式有效:HH:MM[:SS[.ffffff]][Z or [±]HH[:]MM]]]
要对time
进行处理,代码如下:
from datetime import datetime, date, time, timedelta
from pydantic import BaseModel, validator
class Book(BaseModel):
id: int
name: str
create_time: time
# 1.传time 对象
book1 = Book(id=1, name='theshy', create_time=time(15, 26, 16))
print(book1.json())
# 2.传字符串
book2 = Book(id=2, name='rookie', create_time="15:26:16")
print(book2.json())
------------
输出结果如下:
{"id": 1, "name": "theshy", "create_time": "15:26:16"}
{"id": 2, "name": "rookie", "create_time": "15:26:16"}
timedelta时间差
timedelta
对象表示的是两个时间点的时间差,两个date
或datetime
对象相减就可以返回一个timedelta
对象。timedelta
字段可以是:
timedelta
, 现有timedelta
对象int
或float
, 假定为秒str
, 以下格式有效:[-][DD ][HH:MM]SS[.ffffff] 和 [±]P[DD]DT[HH]H[MM]M[SS]S
要对时间差数据进行处理,代码如下:
from datetime import date, datetime, time, timedelta
from pydantic import BaseModel
class Model(BaseModel):
d: date = None
dt: datetime = None
t: time = None
td: timedelta = None
m = Model(
d=1966280412345.6789,
dt='2032-04-23T10:20:30.400+02:30',
t=time(4, 8, 16),
td='P3DT12H30M5S',
)
print(m.dict())
--------------
输出结果如下:
{'d': datetime.date(2032, 4, 22),
'dt': datetime.datetime(2032, 4, 23, 10, 20, 30, 400000, tzinfo=datetime.timezone(datetime.timedelta(seconds=9000))),
't': datetime.time(4, 8, 16),
'td': datetime.timedelta(days=3, seconds=45005)}
总结
本文主要介绍了pydantic对于时间数据的处理,不只是datetime
数据,还有日期,时间点,时间差等数据的验证处理,希望本文对大家有所帮助。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!