Python中出生日期的格式检查

Posted

技术标签:

【中文标题】Python中出生日期的格式检查【英文标题】:Format check on date of birth in Python 【发布时间】:2021-07-10 23:15:30 【问题描述】:

我目前正在开发一个数据库应用程序,用户填写客户表格并将数据添加到 SQLite3 表中。我正在尝试向我的代码添加验证,并且它可以正常工作,但是它将记录添加到包含无效数据的表中。如果数据无效,有什么方法可以停止代码的执行?请看下面的代码和界面截图:

    def validate(self):
        dateofbirth = self.DOBEntry.get()
        try:
            datetime.datetime.strptime(dateofbirth, '%D/%M/%Y')
        except ValueError:
            tkinter.messagebox.showerror("Error","Please enter the date of birth in the correct format DD-MM-YYYY")



    def AddCustomer(self):
        customerid = int(self.CustomerEntry.get())
        branchid = self.BranchEntry.get()
        name = self.NameEntry.get()
        surname = self.SurnameEntry.get()
        dateofbirth = self.DOBEntry.get()
        town = self.TownEntry.get()
        postcode = self.PostcodeEntry.get()
        email = self.EmailEntry.get()
        telephone = self.TelephoneEntry.get()
        medical = self.MedicalEntry.get()
        try:
            self.validate()
            with sqlite3.connect("LeeOpt.db") as db:
                cursor = db.cursor()
                add_customer = ('''INSERT INTO Customer(CustomerID, BranchID, Name, Surname, DateOfBirth, Town, Postcode, EmailAddress, TelephoneNo, MedicalConditions)
                VALUES (?,?,?,?,?,?,?,?,?,?)''')
                cursor.execute(add_customer, [(customerid),(branchid),(name),(surname),(dateofbirth),(town),(postcode),(email),(telephone),(medical)])
                tkinter.messagebox.showinfo("Notification","Customer added successfully")
                self.ClearEntries()
        except (sqlite3.IntegrityError): 
            tkinter.messagebox.showerror("Error","This CustomerID is already taken, please try another.")
            self.ClearID()

【问题讨论】:

什么是无效数据? 只需让validate 返回TrueFalse,然后在更新记录之前检查该值。或者,让validate 在显示对话框后重新引发异常。 @CoolCloud 一个不符合函数中规定格式的日期。 我认为将self.validate 放在try 内部并不好,因为无论如何都不会显示任何错误,因为您跳过了函数中的错误。所以我认为最好从函数中返回TrueFalse 并检查if self.validate(): 然后继续。 @CoolCloud 请原谅我的无知,我是Python初学者,如何返回TrueFalse?。我做了一些研究,但无法理解它。 【参考方案1】:

试试这样的:

def validate(self):
    dateofbirth = self.DOBEntry.get()
    try:
        datetime.datetime.strptime(dateofbirth, '%D/%M/%Y')
        return True # returns a boolean True
    except ValueError: 
        tkinter.messagebox.showerror("Error","Please enter the date of birth in the correct format DD-MM-YYYY")
        return False

def AddCustomer(self):
    # Same code

    if self.validate(): # If true is returned, then...also same as if self.validate()==True
        try:
            with sqlite3.connect("LeeOpt.db") as db:
                cursor = db.cursor()
                add_customer = ('''INSERT INTO Customer(CustomerID, BranchID, Name, Surname, DateOfBirth, Town, Postcode, EmailAddress, TelephoneNo, MedicalConditions)
                VALUES (?,?,?,?,?,?,?,?,?,?)''')
                cursor.execute(add_customer, (customerid,branchid,name,surname,dateofbirth,town,postcode,email,telephone,medical))
                tkinter.messagebox.showinfo("Notification","Customer added successfully")
                self.ClearEntries()
        except (sqlite3.IntegrityError): 
            tkinter.messagebox.showerror("Error","This CustomerID is already taken, please try another.")
            self.ClearID()

这里True只有在行中没有错误的情况下才会返回,否则False将被返回,所以基于此,你在AddCustomer()中创建一个if。我还将execute 的参数更改为tuple 而不是list,因为这是惯例。

【讨论】:

我试过这个,但是,即使日期格式输入正确,它也会不断检测到错误并显示错误消息。 @arthur_fleck 日期错误信息?如果出现这种情况,则表示存在ValueError,请在函数内部使用print(dateofbirth),并确保数据符合您的预期。

以上是关于Python中出生日期的格式检查的主要内容,如果未能解决你的问题,请参考以下文章

在 JavaScript 中计算/检查出生日期小于 110 岁

出生日期直接算出年龄,excel按出生日期算年龄函数

在 iOS 中将用户出生日期格式化为 NSDate 对象

sql 从身份证中自动获取出生日期,显示格式为XXXX-XX-XX

EXCEL表格中 怎么用函数从身份证号获取出生日期,年龄、性别

JavaScript 检查出生日期