<p>你在做那些不该做的字符串操作,这让我很恼火。您应该直接使用时间对象。我知道@Grismar已经为你提供了一种直接与《泰晤士报》合作的方式。尽管如此,我还是花了一些时间自己整理一些东西,作为另一个例子。我想这有点简单,而且还需要测试。无论如何</p>
<pre><code>import datetime
# Define a short alias for "datetime.time"
t = datetime.time
# Our status values
TIME_NONE = "TIME NONE"
BREAK_OUT = "BREAK OUT"
TIME_IN = "TIME IN"
TIME_OUT = "TIME OUT"
# Function that lets us represent AM and PM times in a more readable fashion below
def AM(hours):
return hours
def PM(hours):
return hours + 12
# Get the status for the specified time
def get_status(user_time):
if user_time >= t(AM(10)) and user_time <= t(AM(10), 15) \
or user_time >= t(PM(3)) and user_time <= t(PM(3), 15) \
or user_time >= t(AM(12)) and user_time <= t(PM(1), 15):
status = BREAK_OUT
elif user_time >= t(AM(5)) and user_time <= t(PM(4)):
status = TIME_IN
elif user_time >= t(PM(5)) and user_time <= t(PM(11)):
status = TIME_OUT
else:
status = TIME_NONE
return status
# Convert a time to a human readable string
def time_to_string(t):
return t.strftime('%I:%M %p')
# Test that one time meets our expectation in terms of its status
def test(t, expect_status):
status = get_status(t)
print(time_to_string(t) + " = " + status + ": ", end = "")
if status == expect_status:
print("yes")
else:
print("NO!!!!!!!")
def run_tests():
# Run a test for each time period
test(t(AM(10), 8), BREAK_OUT)
test(t(AM(12), 35), BREAK_OUT)
test(t(PM(3)), BREAK_OUT)
test(t(AM(6), 30), TIME_IN)
test(t(PM(9), 45), TIME_OUT)
test(t(PM(11), 45), TIME_NONE)
run_tests()
</code></pre>