Различные проблемы даты и времени Python - PullRequest
2 голосов
/ 04 февраля 2009

У меня есть два метода, которые я использую в качестве пользовательских тегов в шаблонизаторе:

# Renders a <select> form field
def select_field(options, selected_item, field_name):
    options = [(str(v),str(v)) for v in options]
    html = ['<select name="%s">' % field_name]
    for k,v in options:
        tmp = '<option '
        if k == selected_item:
            tmp += 'selected '
        tmp += 'value="%s">%s</option>' % (k,v)
        html.append(tmp)
    html.append('</select>')
    return '\n'.join(html)

# Renders a collection of <select> fields for datetime values
def datetime_field(current_dt, field_name):
    if current_dt == None:
        current_dt = datetime.datetime.now()
    day = select_field(range(1, 32), current_dt.day, field_name + "_day")
    month = select_field(range(1, 13), current_dt.month, field_name + "_month")
    year = select_field(range(datetime.datetime.now().year, datetime.datetime.now().year + 10), current_dt.year, field_name + "_year")
    hour = select_field(range(1, 13), current_dt.hour, field_name + "_hour")
    minute = select_field(range(1, 60), current_dt.minute, field_name + "_minute")
    period = select_field(['AM', 'PM'], 'AM', field_name + "_period")
    return "\n".join([day, '/', month, '/', year, ' at ', hour, ':', minute, period])

Как вы можете видеть в комментариях, я пытаюсь сгенерировать выбранные поля для построения значения даты и времени.

Мой первый вопрос: как сделать так, чтобы диапазоны дня, месяца, часа и минуты использовали две цифры? Например, код генерирует «1, 2, 3 ...», а я хотел бы «01, 02, 03».

Далее, когда поля генерируются, значения предоставленного datetime не выбираются автоматически, хотя я советую методу select_field добавить атрибут «selected», когда значение равно предоставленному значению datetime.

Наконец, как мне получить 12-часовой идентификатор периода (AM / PM) для предоставленной даты и времени? На данный момент я просто выбираю «AM» по умолчанию, но я бы хотел указать это значение из самой даты и времени.

Ответы [ 4 ]

5 голосов
/ 05 февраля 2009

Чтобы превратить целочисленный диапазон в двухзначные строки:

>>> range(13)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> [ '%02d' % i for i in range(13) ]
['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']

Затем, чтобы получить индикатор AM / PM:

>>> import datetime
>>> current_dt = datetime.datetime.now()
>>> current_dt
datetime.datetime(2009, 2, 4, 22, 2, 14, 390000)
>>> ['AM','PM'][current_dt.hour>=12]
'PM'

Voila!

1 голос
/ 05 февраля 2009

Чтобы добавить к моему предыдущему ответу несколько комментариев о выборе выбранной опции.

Во-первых, ваш код генерации HTML будет более надежным, если вместо разделения начала и конца тегов HTML ...

html = ['<select name="%s">' % field_name]
for k,v in options:
    tmp = '<option '
    if k == selected_item:
            tmp += 'selected '
    tmp += 'value="%s">%s</option>' % (k,v)
    html.append(tmp)
html.append('</select>')

... вы создали их как атомные целые:

opt_bits = ('<option %s value="%s">'% (['','selected'][str(v)==selected_item], str(v)) for v in options)
# If running Python2.5, it's better to use: 'selected' if str(v)==selected_item else '' 
html = '<select name=%s>%s</select>' % '\n'.join(opt_bits)

Во-вторых, я не уверен, почему вы удваиваете список параметров, а не используете одно и то же имя переменной, как я делал выше:

options = [(str(v),str(v)) for v in options]   # ????

В этом нет необходимости, если только параметры не являются навязчивыми, а вы намеревались что-то вроде:

[ (k,v) for k,v in options.iteritems() ]

Наконец, ваш код сломается, если элементы списка будут содержать кавычки. Посмотрите в документации по Python стандартные функции для выхода из HTML.

Удачи!

1 голос
/ 04 февраля 2009

Вопрос 1:

>>> '%02d' % 2
'02'
>>> '%02d' % 59
'59'
0 голосов
/ 05 февраля 2009
  1. Укажите строку формата для метода select_field для отображения начальных нулей.

    >>> print "%02i" % (1, )
    01
    
  2. datetime.hour - 0-23, поэтому вы должны адаптировать его при настройке поля. Это также ответ о том, как обнаружить AM / PM. Убедитесь, что конвертировали обратно правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...