如何限制用户为我的时间字段输入错误的格式
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)$
正则表达式详细信息:
^
: 开始
(?:[01]\d|2[0-3]):
:从 00
到 23
的小时数,然后是 :
(?:[0-5]\d)-
:从 00
到 59
的分钟数,然后是 -
(?:[01]\d|2[0-3]):
:从 00
到 23
的小时数,然后是 :
(?:[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]
Niel Godfrey Ponciano 的回答解决了问题,但我会做以下修改:
user_input = user_input.replace(' ', '')
您不希望时间解析因空格而失败,也不应让用户因小错误而烦恼。
我个人会选择 datetime.strptime()
而不是 time.strptime()
因为功能更方便。不过后者也没什么问题。
我已经在堆栈溢出上搜索过这个问题,但没有找到对我有帮助的东西或者根本不理解它们。我想要的是一种确认用户已按以下格式输入时间的方法 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)$
正则表达式详细信息:
^
: 开始(?:[01]\d|2[0-3]):
:从00
到23
的小时数,然后是:
(?:[0-5]\d)-
:从00
到59
的分钟数,然后是-
(?:[01]\d|2[0-3]):
:从00
到23
的小时数,然后是:
(?:[0-5]\d)
:00
tp59
的会议记录
$
:结束
我们也可以在这里使用正则表达式:
([01][0-9]|[2][0-3]):[0-5][0-9]-([01][0-9]|[2][0-3]):[0-5][0-9]
Niel Godfrey Ponciano 的回答解决了问题,但我会做以下修改:
user_input = user_input.replace(' ', '')
您不希望时间解析因空格而失败,也不应让用户因小错误而烦恼。
我个人会选择 datetime.strptime()
而不是 time.strptime()
因为功能更方便。不过后者也没什么问题。