45

I want to convert my string date to django date format. I tried a method. but did not work.

date = datetime.datetime.strptime(request.POST.get('date'),"Y-mm-dd").date()

I got this error.

time data '2014-04-07' does not match format 'Y-mm-dd'

what 's wrong in my code.

alecxe
  • 462,703
  • 120
  • 1,088
  • 1,195
SAFEER N
  • 1,157
  • 2
  • 17
  • 30

4 Answers4

69

It should be %Y-%m-%d:

>>> s = "2014-04-07"
>>> datetime.datetime.strptime(s, "%Y-%m-%d").date()
datetime.date(2014, 4, 7)

According to the documentation:

  • %Y stands for a year with century as a decimal number
  • %m - month as a zero-padded decimal number
  • %d - day of the month as a zero-padded decimal number
starball
  • 20,030
  • 7
  • 43
  • 238
alecxe
  • 462,703
  • 120
  • 1,088
  • 1,195
  • 3
    I have a string date with timezone which is giving me an error when converting: `ValueError: unconverted data remains: T18:30:00.000Z` How can I convert this string date: `2019-10-15T18:30:00.000Z`? – saran3h Oct 24 '19 at 04:47
  • 1
    @saran3h you can use django.utils.dateparse.parse_datetime for that. Check Melvyn's answer here: https://stackoverflow.com/questions/8636760/parsing-a-datetime-string-into-a-django-datetimefield – Pergola Apr 06 '20 at 17:56
37

It might be convenient to use django's dateparse in this case.

from django.utils.dateparse import parse_date
date_str = request.POST.get('date')
date = parse_date(date_str)
Antoine Pinsard
  • 33,148
  • 8
  • 67
  • 87
Daniel Backman
  • 5,121
  • 1
  • 32
  • 37
11

django.utils.dateparse.parse_date function will return None if given date not in %Y-%m-%d format

I have not found a function in django source code to parse string by DATE_INPUT_FORMATS. So I wrote a custom helper function for that and I have added to here for help others.

from datetime import datetime
from django.utils.formats import get_format

def parse_date(date_str):
    """Parse date from string by DATE_INPUT_FORMATS of current language"""
    for item in get_format('DATE_INPUT_FORMATS'):
        try:
            return datetime.strptime(date_str, item).date()
        except (ValueError, TypeError):
            continue

    return None
Mesut Tasci
  • 2,970
  • 1
  • 30
  • 36
6

It might be convenient to use Django's dateparse's parse_datetime in this case. you don't have to explicitly apply the data time format if that is dynamic.

from django.utils.dateparse import parse_datetime
date = parse_datetime(datetime_str)