在我基于python的应用程序中,用户可以使用日期分隔符变体以dd / mm/yy的格式输入日期(就像他们可以使用/或空格作为分隔符一样)。因此,所有这些都是有效日期:
10/02/2009
07 22 2009
09-08-2008
9-9/2008
11/4 2010
03/07-2009
09-01 2010
现在,为了测试它,我需要创建这样的日期列表,但是我不知道如何使用分隔器自动生成这些日期字符串的随机组合。
这就是我开始做的:
date = ['10', '10', '2010']
seperators = ['/', '-', ' ']
for s in seperators:
new_date = s.join(date)
发布于 2013-09-04 11:12:01
我认为以前的答案并没有太大帮助。如果您在测试数据中选择"day“作为1-31的数字,选择"month”作为1-12的任何数字,则您的生产代码必须在某个地方引发异常- 02/31/2013不应被接受!
因此,您应该创建随机但有效的日期,然后使用任意选择的格式字符串从它们创建字符串。这就是我的代码所做的:
import datetime
import time
import random
separators = ["/",",","-"," "]
prefixes = [""," "]
def random_datetime(min_date, max_date):
since_epoch_min = time.mktime(min_date.timetuple())
since_epoch_max = time.mktime(max_date.timetuple())
random_time = random.randint(since_epoch_min, since_epoch_max)
return datetime.datetime.fromtimestamp(random_time)
def random_date_string_with_random_separators(dt):
prefix = random.choice(prefixes)
sep1 = random.choice(separators)
sep2 = random.choice(separators)
format_string = "{}%m{}%d{}%Y".format(prefix, sep1, sep2)
return dt.strftime(format_string)
min_date = datetime.datetime(2012,01,01)
max_date = datetime.datetime(2013,01,01)
for i in range(10):
print random_date_string_with_random_separators(
random_datetime(min_date, max_date)
)
这应该涵盖所有的情况(如果你的数值超过10个)。
不过,我有两点意见:
不要使用随机数据作为测试输入。
您将永远不知道是否有一天您的测试会失败,也许您没有发现所有可能的问题生成的数据。在你的情况下,它应该是好的,但一般来说,这是不好的做法(如果你有其他选择)。或者,您也可以创建一组经过良好考虑的硬编码输入字符串,在其中覆盖所有角的情况。如果有一天你的测试失败了,你知道这不是随机效应。
使用经过良好测试的代码
对于您所描述的任务,有一个库用于此!使用dateutil
。他们有一个奇妙的日期时间解析器,它吞噬了你扔给它的几乎所有东西。示例:
from dateutil import parser
for i in range(10):
date_string = random_date_string_with_random_separators(
random_datetime(min_date, max_date)
)
parsed_datetime = parser.parse(date_string)
print date_string, parsed_datetime.strftime("%m/%d/%Y")
输出:
01 05,2012 01/05/2012
05 17-2012 05/17/2012
06-07-2012 06/07/2012
10 31,2012 10/31/2012
10/04,2012 10/04/2012
11 16,2012 11/16/2012
03/23 2012 03/23/2012
02-26-2012 02/26/2012
01,12-2012 01/12/2012
12-21 2012 12/21/2012
那你就能确定它有效了。dateutil
有大量的单元测试,而且“只是会工作”。你能写的最好的代码就是你不需要测试的代码。
发布于 2013-09-04 10:11:16
我建议你在输入中提供某些信息:
例如:
date = raw_input("Enter date (mm/dd/yyyy): ")
现在使用strptime()
检查它是否正确:
try:
date = time.strptime(date, '%m/%d/%Y')
except ValueError:
print('Invalid date!')
参考资料:
http://docs.python.org/2/library/time.html#time.strptime
发布于 2013-09-04 10:20:16
要自动创建这些日期并将它们添加到列表中,可以使用以下命令:
from random import choice, randrange
dates = []
s = ' -/'
for i in range(100):
dates.append( "%i%s%i%s%i" % (randrange(1,13), choice(s), randrange(1,32), choice(s), randrange(2000,2019) ) )
print dates
https://stackoverflow.com/questions/18610884
复制相似问题