各种Python日期时间问题

时间:2009-02-04 20:54:51

标签: python datetime

我有两种方法可以用作模板引擎中的自定义标记:

# 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”。

接下来,当生成字段时,即使我告诉select_field方法在值等于提供的日期时间值时添加“selected”属性,也不会自动选择提供的日期时间的值。 / p>

最后,如何获取所提供日期时间的12小时周期标识符(AM / PM)?目前,我只是默认选择“AM”,但我想从日期时间本身提供此值。

4 个答案:

答案 0 :(得分:5)

将整数范围转换为两位数字符串:

>>> 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'

瞧!

答案 1 :(得分:1)

问题1:

>>> '%02d' % 2
'02'
>>> '%02d' % 59
'59'

答案 2 :(得分:1)

要添加到我之前的答案,请选择一些关于选择所选选项的注释。

首先,如果不是拆分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的标准函数。

祝你好运!

答案 3 :(得分:0)

  1. select_field方法提供格式字符串以显示前导零。

    >>> print "%02i" % (1, )
    01
    
  2. datetime.hour为0-23,因此您必须在设置字段时进行调整。这也是如何检测AM / PM的答案。确保正确转换回来。