Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 27, 2012 09:00:12

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Из строки в datetime

Здравствуйте!

Мне нужно из строки 2012-12-21 преобразовать в datetime формат

сделал так:

    date = request.GET.get('date')
    if date:
        dt_y, dt_m, dt_d = [int(d) for d in date.split('-')]
        date = datetime.date(dt_y, dt_m, dt_d)
    else:
        date = datetime.date.today()

просто интересно можно ли короче сделать ?)



Отредактировано andreiru (Сен. 27, 2012 09:21:21)

Офлайн

#2 Сен. 27, 2012 09:30:31

fashust
От:
Зарегистрирован: 2011-07-17
Сообщения: 30
Репутация: +  3  -
Профиль   Отправить e-mail  

Из строки в datetime

datetime.fromtimestamp(mktime(strptime('2012-12-21', '%Y.%m.%d')))



import this

Офлайн

#3 Сен. 27, 2012 11:23:05

d1ffuz0r
От: Moscow
Зарегистрирован: 2011-03-25
Сообщения: 127
Репутация: +  5  -
Профиль   Отправить e-mail  

Из строки в datetime

from datetime import datetime
datetime.strptime('2012-12-21', '%Y-%m-%d')

Отредактировано d1ffuz0r (Сен. 27, 2012 11:23:37)

Офлайн

#4 Сен. 28, 2012 12:27:13

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Из строки в datetime

Спасибо всем !

Делаю афишу, нужно выводить события исходя из даты

    try:
        date = datetime.datetime.strptime(request.GET.get('date'), '%Y-%m-%d')
    except TypeError:
        date = None
    if date: events = events.filter(
        Q(date_start__startswith=date) | Q(date_start__lt=date),
        date_end__gte=date
    )

выдаёт Incorrect datetime value: ‘2012-09-27 00:00:00%’ for column ‘date_start’ at row 1

видимо это из-за того что в date у нас и дата и время 2012-09-28 00:00:00, подскажите как получить только дату 2012-09-28 использовать .strftime('%Y-%m-%d') ?






Офлайн

#5 Сен. 28, 2012 13:30:21

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Из строки в datetime

andreiru
date_start__startswith=date

Не очень понял эту конструкцию, разве она может применяться к дате?



Офлайн

#6 Сен. 28, 2012 14:01:03

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Из строки в datetime

FishHook я здесь вычитал



Офлайн

#7 Сен. 28, 2012 14:15:31

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Из строки в datetime

andreiru
FishHook я здесь вычитал

Почитай чуть ниже там же

0
down vote
Here is an interesting technique– I leveraged the startswith procedure as implemented with Django on MySQL to achieve the result of only looking up a datetime through only the date. Basically, when Django does the lookup in the database it has to do a string conversion for the DATETIME MySQL storage object, so you can filter on that, leaving out the timestamp portion of the date– that way %LIKE% matches only the date object and you'll get every timestamp for the given date.

datetime_filter = datetime(2009, 8, 22)
MyObject.objects.filter(datetime_attr__startswith=datetime_filter.date())
This will perform the following query:

SELECT (values) FROM myapp_my_object \
WHERE myapp_my_object.datetime_attr LIKE BINARY 2009-08-22%
The LIKE BINARY in this case will match everything for the date, no matter the timestamp. Including values like:

+———————+
| datetime_attr |
+———————+
| 2009-08-22 11:05:08 |
+———————+
Hopefully this helps everyone until Django comes out with a solution!



Офлайн

#8 Сен. 29, 2012 04:38:21

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Из строки в datetime

def events(request, type=None):
    date_today = datetime.datetime.now()
    # получаю тип
    if type:
        try:
            type = Type.objects.get(uid=type)
        except Event.DoesNotExist:
            raise Http404()
    # полчаю дату
    try:
        date = datetime.datetime.strptime(request.GET.get('date'), '%Y-%m-%d')
    except TypeError:
        date = None
    #events
    events = Event.objects.all()
	
	# если есть тип сортирую по нему
    if type:
        events = events.filter(type=type)
    if date:
	# если дата запроса равна сегоднишнему дню то, 
	# то присваиваю дате запроса время которое сейчас, чтобы убрать события которые уже закончились сегодня
        if date.date() == date_today.date(): date = date_today
        events = events.filter(
            Q(date_start__startswith=date.date()) | Q(date_start__lt=date),# выбераю события которые начнуться сегодня или начались ранее
            date_end__gt=date # дата окончания должна быть больше текущей даты
        )

Сделал так, работает, скажите пожалуйста всё правильно делаю ?



Отредактировано andreiru (Сен. 29, 2012 04:38:47)

Офлайн

#9 Сен. 30, 2012 10:53:31

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Из строки в datetime

Слишком много кода, для такой простой вьюхи,

def events(request, t=None):
    _type=Type.objects.get_or_404(uid=t)
    now=datetime.datetime.now()
    date = datetime.datetime.strptime(request.GET.get('date', now), '%Y-%m-%d')
    events=Event.objects.filter(date_start__lt=date, date_end__gt=now)

А зачем тебе этот __startswiths в дате я так и не понял.
ПС. Не стоит обзывать переменные зарезервированными словами, типа type, list, dict и прочими



Офлайн

#10 Сен. 30, 2012 15:26:44

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Из строки в datetime

FishHook, спасибо буду придерживаться вашему примеру!

Про get_or_404 первый раз слышу, мне выдаёт ошибку:

'Manager' object has no attribute 'get_or_404'

нашёл такой пример, выдаёт:
cannot import name get_or_404

get_or_404 через декоратор работает ?




А зачем тебе этот __startswiths в дате я так и не понял.

в вашей выборке :
events=Event.objects.filter(date_start__lt=date, date_end__gt=now)

будут события которые начались ранее (date_start__lt=date) и закончуться позднее (date_end__gt=now) текущей даты

а нужны события которые начнуться сегодня (date_start__startswith=date.date()) или ранее (date_start__lt=date) и закончаться позднее текущего времени (if date.date() == date_today.date(): date = date_today, date_end__gt=date)



Отредактировано andreiru (Сен. 30, 2012 15:32:14)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version