2

在我基于 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)
4

3 回答 3

2

我认为以前的答案并没有太大帮助。如果您在测试数据中选择“day”作为 1-31 之间的数字,选择“month”作为 1-12 中的任何数字,那么您的生产代码必须在某处引发异常 - 不应接受 2013 年 2 月 31 日!

因此,您应该创建随机但有效的日期,然后使用任意选择的格式字符串从它们创建字符串。这就是我的代码的作用:

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

这应该涵盖所有情况(如果您采用十个以上的值)。

不过,我有两点意见:

不要使用随机数据作为测试输入

您永远不会知道有一天您的测试是否会失败,也许您没有发现生成的数据的所有可能问题。在您的情况下应该没问题,但通常这不是一个好习惯(如果您有其他选择)。或者,您可以创建一套经过深思熟虑的硬编码输入字符串,您可以在其中涵盖所有极端情况。如果有一天你的测试失败了,你知道这不是随机效应。

使用经过良好测试的代码

对于您描述的任务,有一个库!使用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-04T11:12:01.803 回答
0

我建议您在输入中提供某些信息:

例如:

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

如何在 Python 3.x 中验证日期?

于 2013-09-04T10:11:16.557 回答
0

要自动创建这些日期并将它们添加到列表中,您可以使用以下命令:

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
于 2013-09-04T10:20:16.273 回答