Parsing a Datetime String into a Django DateTimeField

前端 未结 5 1820
盖世英雄少女心
盖世英雄少女心 2020-12-05 06:30

I have a Django app with a model that contains a field of type DateTimeField.
I am pulling data from the web in the format of 2008-04-10 11:47:58-05.
I

相关标签:
5条回答
  • 2020-12-05 07:09

    String format of Django DateTimeField is "%Y-%m-%dT%H:%M:%S.%fZ". Hence, conversion between eachother can be done using strptime() or strptime() using this format.

    eg. for string formatted value (2016-10-03T19:00:00.999Z), it can be converted to Django datetime object as :

    from datetime import datetime
    
    datetime_str = '2016-10-03T19:00:00.999Z'
    
    datetime_object = datetime.strptime(datetime_str, "%Y-%m-%dT%H:%M:%S.%fZ")
    
    0 讨论(0)
  • 2020-12-05 07:10

    If you're using Django Forms, you can specify input_formats to your DateField. See the DateField documentation

    If you are wanting to parse arbitrary date information, you could use something like parsedatetime and implement a method that Django calls to do the parsing before it hits the validators. (See this SO answer for a good summary of how validations work and when to insert them)

    0 讨论(0)
  • 2020-12-05 07:15

    You can use

    import dateutil.parser
    dateutil.parser.parse('2008-04-10 11:47:58-05')
    

    Which returns a datetime (that can be assigned to the DateTimeField).

    0 讨论(0)
  • 2020-12-05 07:24

    You can also use Django's implementation. I would in fact prefer it and only use something else, if Django's parser cannot handle the format.

    For example:

    >>> from django.utils.dateparse import parse_datetime
    >>> parse_datetime('2016-10-03T19:00:00')
    datetime.datetime(2016, 10, 3, 19, 0)
    >>> parse_datetime('2016-10-03T19:00:00+0200')
    datetime.datetime(2016, 10, 3, 19, 0, tzinfo=<django.utils.timezone.FixedOffset object at 0x8072546d8>)
    

    To have it converted to the right timezone when none is known, use make_aware from django.utils.timezone.

    So ultimately, your parser utility would be:

    from django.utils.dateparse import parse_datetime
    from django.utils.timezone import is_aware, make_aware
    
    def get_aware_datetime(date_str):
        ret = parse_datetime(date_str)
        if not is_aware(ret):
            ret = make_aware(ret)
        return ret
    
    0 讨论(0)
  • 2020-12-05 07:26

    I've been using this:

    from django.utils.timezone import get_current_timezone
    from datetime import datetime
    tz = get_current_timezone()
    dt = tz.localize(datetime.strptime(str_date, '%m/%d/%Y'))
    
    0 讨论(0)
提交回复
热议问题