Python,日期验证

Cha*_*ter 4 python datetime

我试图想出一种以最好的pythonic方式实现这一目标的方法.现在,我能想到的唯一方法就是暴力破解它.

用户以下列方式之一输入日期(通过命令行)(例如./mypy.py date ='20110909.00 23')

date='20110909'
date='20110909.00 23'
date='20110909.00 20110909.23'
Run Code Online (Sandbox Code Playgroud)

所有这三个例子都应该有相同的结果,如果它填充一个列表(我可以排序),例如

['20110909.00', '20110909.23]
Run Code Online (Sandbox Code Playgroud)

或者甚至是两个排序的单独变量,但在所有情况下它都是YYYYMMDD.HH,并且需要确保它确实是日期而不是文本.

有任何想法吗?

谢谢.

+++++ EDIT +++++在插入这个之后,我想我需要先做很多日期检查/操作.这一切似乎都很有效.除了在最后,我通过日期验证运行列表,它每次都失败 - 即使它应该通过.

(我用它启动)./ test.py date ='20110909.00 23'

(或日期的任何变化 - 即日期= '20 22'或日期='20110909'或日期='20110909.00 23'等)

import sys, re, time, datetime

now = datetime.datetime.now()
tempdate=[]
strfirstdate=None
strtempdate=None

temparg2 = sys.argv
del temparg2[0]
tempdate = temparg2[0].replace('date=','')
date = tempdate.split(' ');

tempdate=[]
date.sort(key=len, reverse=True)
result = None

# If no date is passed then create list according to [YYMMDD.HH, YYMMDD.HH]
if date[0] == 'None':
    tempdate.extend([now.strftime('%Y%m%d.00'), now.strftime('%Y%m%d.%H')])


# If length of date list is 1 than see if it is YYMMDD only or HH only, and create list according to [YYMMDD.HH, YYMMDD.HH]
elif len(date) == 1:
    if len(date[0]) == 8:
        tempdate.extend([ date[0] + '.00', date[0] + '.23'])
    elif len(date[0]) == 2:
        tempdate.extend([now.strftime('%Y%m%d') + '.' + date[0], now.strftime('%Y%m%d') + '.' + date[0]])
    else:
        tempdate.extend([date[0], date[0]])


# iterate through list, see if value is YYMMDD only or HH only or YYYYMMDD.HH, and create list accoring to [YYYYMMDD.HH, YYYYMMDD.HH] - maximum of 2 values
else:
    for _ in range(2):
        if len(date[_]) == 8:
            strfirstdate = date[0]
            tempdate.append([ date[_] + '.00'])
        elif len(date[_]) == 2:
            if _ == 0:  # both values passed could be hours only
                tempdate.append(now.strftime('%Y%m%d') + '.' + date[_])
            else:  # we must be at the 2nd value passed.
                if strfirstdate == None:
                    tempdate.append(now.strftime('%Y%m%d') + '.' + date[_])
                else:
                    tempdate.append(strfirstdate + '.' + date [_])
        else:
            strfirstdate = date[0][:8]
            tempdate.append(date[_])

tempdate.sort()


for s in tempdate:
    try:
        result = datetime.datetime.strptime(s, '%Y%m%d.%H')
    except:
        pass

if result is None:
    print 'Malformed date.'
else:
    print 'Date is fine.'

print tempdate
Run Code Online (Sandbox Code Playgroud)

++++编辑2 ++++如果我删除底部(在tempdate.sort()之后)并用它替换它.

strfirstdate = re.compile(r'([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]+\.[0-9][0-9])')
for s in tempdate:
    if re.match(strfirstdate, s):
        result = "validated"
    else:
        print "#####################"
        print "#####################"
        print "##  error in date  ##"
        print "#####################"
        print "#####################"
        exit
Run Code Online (Sandbox Code Playgroud)

它将适当地验证.

这整个方法似乎不是非常pythonic.

Ble*_*der 7

您可以创建一个掩码并对其进行解析,try...except以确定日期字符串是否与多个掩码中的一个匹配.我有一个项目的代码,所以我稍微修改了它:

from time import mktime, strptime
from datetime import datetime

date = '20110909.00 20110909.23'.split(' ')[0]
result = None

for format in ['%Y%m%d', '%Y%m%d.%H']:
  try:
    result = datetime.strptime(date, format)
  except:
    pass

if result is None:
  print 'Malformed date.'
else:
  print 'Date is fine.'
Run Code Online (Sandbox Code Playgroud)