在Django与时间有关的问题

2024-09-30 03:23:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Django中创建插槽有时间限制。 我写的代码如下:

    start_time = request.POST.get('start_time')
    end_time = request.POST.get('end_time')
    dateTimeA = datetime.datetime.strptime(start_time, '%H:%M')
    dateTimeB = datetime.datetime.strptime(end_time, '%H:%M')
    dateTimeDifference = dateTimeB - dateTimeA
    dateTimeDifferenceInHours = dateTimeDifference.total_seconds() / 3600

    if dateTimeDifferenceInHours <= 0:
        dateTimeB += datetime.timedelta(days=1)
        dateTimeDifference = dateTimeB - dateTimeA
        dateTimeDifferenceInHours = dateTimeDifference.total_seconds() / 3600

我也有一些限制:

约束1:计时:用户将给出从5:00 AM to 4:59 AM变化的计时

约束2:结束时间不能在第二天的4:59 am之后

案例:

案例1:从凌晨2点到凌晨4点创建插槽应该可以正常工作

案例2:目前,我编写的代码在案例中的工作不正确:

Start_time = 8:00
End_time = 6:00

这里,在前端,start_time = 8:00表示早晨,end_time = 6:00表示第二天早上,违反了我们的第2个约束

案例3:当有人给出start_time = 5:00end_time = 2:00时,我们需要在结束时间中添加第二天

前端如下所示(代码是用HTML编写的):

enter image description here

因此,如果有人能帮助我改进我写的代码,使我上面的所有案例都能正常工作


Tags: 代码getdatetimetimerequest时间poststart
1条回答
网友
1楼 · 发布于 2024-09-30 03:23:16

如果我理解正确:

1/开始时间必须至少为5:00(上午)

2/a 5:00(上午)之前的结束时间表示“下一天”

所以

5点之前的1/a开始时间错误(简单)

2/如果你的结束时间在5:00之前,那就是“第二天”(简单)

3/如果是在上午5:00之后(包括在内),但在开始时间之前,则是错误的(简单)

4/如果是在开始时间之后,则假定是在同一天

照此,这将产生预期的结果:

# mock Django's ValidationError
class ValidationError(Exception):
    pass

def check(start, end):
    # start: datetime
    # end: datetime

    if start.hour < 5:
        raise ValidationError("start time must be >= 5:00 AM")

    if end.hour < 5:
        # end hour < 5 means 'next day'
        end = end + timedelta(days=1)

    elif end.hour < start.hour:
        # unless it's between 0 and 4, end hour must be greater
        # than start hour
        raise ValidationError("end time must be either <= 4:59 or greater than start time")

    return start, end



# and the tests:

def test_ok():
    start = datetime(2020, 4, 29, 5, 0)
    end = datetime(2020, 4, 29, 7, 0)

    try:
        new_start, new_end = check(start, end)
    except ValidationError as e:
        assert False, "should not have raised {}".format(e)

    assert new_start == start, "s should equal start"
    assert new_end == end, "e should equal end"


def test_start_before_5():
    start = datetime(2020, 4, 29, 4, 50)
    end = datetime(2020, 4, 29, 7, 0)

    try:
        check(start, end)
    except ValidationError as e:
        assert e.args[0] == "start time must be >= 5:00 AM"
    else:
        assert False, "should have raised a validation error for start < 5"

def test_end_before_5():
    start = datetime(2020, 4, 29, 8)
    end = datetime(2020, 4, 29, 4, 59)

    try:
        start, end = check(start, end)
    except ValidationError as e:
        assert False, "should not have raised {}".format(e)
    else:
        endt = (end.year, end.month, end.day, end.hour, end.minute)
        expected = (2020, 4, 30, 4, 59)
        assert  endt == expected, "should have set end date on next day"

def test_end_after_5_but_before_start():
    start = datetime(2020, 4, 29, 8)
    end = datetime(2020, 4, 29, 6)

    try:
        check(start, end)
    except ValidationError as e:
        assert e.args[0] == "end time must be either <= 4:59 or greater than start time"
    else:
        assert False, "should have raised a ValidationError"


if __name__ == "__main__":
    test_ok()
    test_start_before_5()
    test_end_before_5()
    test_end_after_5_but_before_start()

作为补充说明,我强烈建议您使用Django Form(或ModelForm,如果合适)进行用户输入验证

相关问题 更多 >

    热门问题