【问题标题】:How to convert a date value to date type for comparison?如何将日期值转换为日期类型以进行比较?
【发布时间】:2017-11-02 19:05:59
【问题描述】:

我正在读取用户的日期值,需要在 django 中进行日期比较。我找不到任何答案如何做到这一点。我真正需要的是将字符串转换为日期,以便可以比较它的相等/小于/大于值。

我获取表单值如下。

start_date = form_new_task.cleaned_data['start_date']

我需要将 start_date 值与date.today() 比较是否相等/小于/大于。

谁能告诉我执行此操作的确切方法。我没有从输入中读取任何时间部分,因为我将表单输入设置为 date 字段(不是 datetime)。

更新到完整代码:

在表单声明中:

class Form_Task(forms.Form):
    start_date = forms.DateField(label='Check-In Date', initial='2017-05-05',
                                   widget=forms.DateInput(attrs={'class': 'form-control,'size': 10}))

在 POST 请求中:

form_new_task = Form_Task(request.POST)
    if form_new_task.is_valid():
        start_date = form_new_task.cleaned_data['start_date']

        if start_date < date.today()
            err_str = 'Start date cannot be a past date.' # here I don't get this assigned. It's evaluate to False.

【问题讨论】:

  • 您的问题不清楚。如果start_dateDateField,那么cleaned_data['start_date'] 应该已经是一个日期实例。
  • 使用.date()方法这将帮助你看到Compare a Date
  • 因为已经是日期了。你实际上不需要转换任何东西。
  • 此外,这种比较应该作为表单验证的一部分进行。您应该在表单类的clean_start_date 方法中执行此操作。
  • “我不能简单地比较它们”是什么意思?

标签: django django-forms


【解决方案1】:

我想出了这样做的方法,并认为这对其他人会有所帮助。我已将 start_date 字段声明为 DateField ,并且当我读取它作为日期类型对象(实际上我认为是日期时间)的值时。所以我必须在这两天内得到一个增量(差异)。

表格:

class Form_Task(forms.Form):
    start_date = forms.DateField() # declaration

在 post 请求处理方法中:

    form_new_task = Form_Task(request.POST)

    if form_new_task.is_valid():
      start_date = form_new_task.cleaned_data['start_date']
      delta = start_date - date.today()

      if delta.days < 0:
        err_str = 'Start date cannot be a past date.'
      elif delta.days == 0:
        ....
        ....

【讨论】:

  • 如果您有DateField,那么cleaned_data['start_date'] 将是date,而不是datetime。如果需要,您可以创建增量,但您不必这样做。只需if start_date &lt; date.today(): 就可以了。最后,正如 Daniel 建议的那样,最好在表单中添加一个 clean_start_date 方法并在那里进行检查(有关更多信息,请参阅 the docs)。
  • 谢谢@Alasdair。我试过这种方法,它不会工作。但是获得增量对我有用。
【解决方案2】:

你可以像这样比较日期,

from datetime import datetime

if start_date < datetime.today().date():
    err_str = 'Start date cannot be a past date.'

【讨论】:

  • 我无法将start_date 传递给strptime。它说strptime() argument 1 must be str, not datetime.date,这意味着它已经是一个日期对象。他们为什么我无法将其与date.today() 进行比较。我需要正确的函数或代码来比较这些。我也不能打电话给datetime.datetime.today().date()。它给出了同样的错误。
  • 如果它是一个日期对象,那么为什么不能将它与 date.toda() 进行比较?它应该工作..
  • 请参考我发布的答案。我认为这很清楚,因为我可以根据返回的值比较各种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
相关资源
最近更新 更多