如何限制用户为我的时间字段输入错误的格式

How do I limit the user from entering the wrong format for my time field

我已经在堆栈溢出上搜索过这个问题,但没有找到对我有帮助的东西或者根本不理解它们。我想要的是一种确认用户已按以下格式输入时间的方法 hh:mm-hh:mm。示例:13:30-14:30。我不介意格式是 12 小时还是 24 小时。还需要限制时间,因为分钟不应超过 59,小时不应超过 23。我见过使用正则表达式的解决方案,我也看过官方文档,但我觉得很难理解。因此,如果有人使用正则表达式作为答案,我不介意接受它,只要答案能解释正则表达式的含义即可。

pattern=r'[0-2][0-9]:[0-5][0-9]-[0-2][0-9]:[0-5][0-9]'
这是我的尝试,但由于它清晰可见,因此存在很多错误。根据这个表达式,
29:58-29:59
是有效时间,当然不是。

正则表达式只会让它变得更复杂。如果时间正确,请改用 time.strptime() 来解析。使用 time 模块,您可以高度自定义它以读取 12h 或 24h 格式,读取字符串“AM”或“PM”等。

然后如果您还想验证第二次是否大于第一次,您也可以轻松地使用 time 模块中的功能来执行此操作。

import time


for data in [
    "13:30-14:30",
    "13:61-14:30",
    "13:30-14:99",
    "00:00-23:59",
    "00:0023:59",
    "XY:10-12:30",
    "01:44-06:00",
    "-11:10-12:30",
    "11:10-12:30",
    "26:10-34:12",
]:
    print(data)

    # Parse as 24h format
    try:
        start_time, _, end_time = data.partition("-")
        start_time = time.strptime(start_time, "%H:%M")
        end_time = time.strptime(end_time, "%H:%M")
    except Exception as error:
        print("\tThe time is invalid in 24h format!")
    else:
        print("\tThe time is valid in 24h format")

    # Parse as 12h format
    try:
        start_time, _, end_time = data.partition("-")
        start_time = time.strptime(start_time, "%I:%M")
        end_time = time.strptime(end_time, "%I:%M")
    except Exception as error:
        print("\tThe time is invalid in 12h format!")
    else:
        print("\tThe time is valid in 12h format")

输出:

13:30-14:30
    The time is valid in 24h format
    The time is invalid in 12h format!
13:61-14:30
    The time is invalid in 24h format!
    The time is invalid in 12h format!
13:30-14:99
    The time is invalid in 24h format!
    The time is invalid in 12h format!
00:00-23:59
    The time is valid in 24h format
    The time is invalid in 12h format!
00:0023:59
    The time is invalid in 24h format!
    The time is invalid in 12h format!
XY:10-12:30
    The time is invalid in 24h format!
    The time is invalid in 12h format!
01:44-06:00
    The time is valid in 24h format
    The time is valid in 12h format
-11:10-12:30
    The time is invalid in 24h format!
    The time is invalid in 12h format!
11:10-12:30
    The time is valid in 24h format
    The time is valid in 12h format
26:10-34:12
    The time is invalid in 24h format!
    The time is invalid in 12h format!

有关可能的格式,请参阅:

使用此模式(24 小时格式):/^([0-1][0-9]|2[0-4])\:([0-5][0-9])\-([0-1][0-9]|2[0-3])\:([0-5][0-9])$/g

图案说明:

对于小时: 如果第一个数字是 0 或 1,那么第二个数字可以在 0-9 之间(例如 01、09、18 和...),或者如果第一个数字是 2 然后第二个数字可以在 0-3 之间(如 20、21、22 和 23)

对于分钟: 如果第一个数字介于 0-5 之间,则第二个数字可以介于 0-9 之间(与所有分钟数字一样)。

如果您正在寻找正则表达式解决方案,那么此正则表达式可能适合您:

^(?:[01]\d|2[0-3]):(?:[0-5]\d)-(?:[01]\d|2[0-3]):(?:[0-5]\d)$

RegEx Demo

正则表达式详细信息:

  • ^: 开始
  • (?:[01]\d|2[0-3])::从 0023 的小时数,然后是 :
  • (?:[0-5]\d)-:从 0059 的分钟数,然后是 -
  • (?:[01]\d|2[0-3])::从 0023 的小时数,然后是 :
  • (?:[0-5]\d)00 tp 59
  • 的会议记录
  • $:结束

我们也可以在这里使用正则表达式:

([01][0-9]|[2][0-3]):[0-5][0-9]-([01][0-9]|[2][0-3]):[0-5][0-9]

演示:https://regex101.com/r/EeImIa/1

Niel Godfrey Ponciano 的回答解决了问题,但我会做以下修改:

user_input = user_input.replace(' ', '')

您不希望时间解析因空格而失败,也不应让用户因小错误而烦恼。

我个人会选择 datetime.strptime() 而不是 time.strptime() 因为功能更方便。不过后者也没什么问题。