首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python日期字符串测试

Python日期字符串测试
EN

Stack Overflow用户
提问于 2013-09-04 10:02:38
回答 3查看 3.4K关注 0票数 3

在我基于python的应用程序中,用户可以使用日期分隔符变体以dd / mm/yy的格式输入日期(就像他们可以使用/或空格作为分隔符一样)。因此,所有这些都是有效日期:

代码语言:javascript
运行
复制
10/02/2009
07 22 2009
09-08-2008
9-9/2008
11/4 2010
 03/07-2009
09-01 2010

现在,为了测试它,我需要创建这样的日期列表,但是我不知道如何使用分隔器自动生成这些日期字符串的随机组合。

这就是我开始做的:

代码语言:javascript
运行
复制
date = ['10', '10', '2010']
seperators = ['/', '-', ' ']
for s in seperators:
    new_date = s.join(date)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-04 11:12:01

我认为以前的答案并没有太大帮助。如果您在测试数据中选择"day“作为1-31的数字,选择"month”作为1-12的任何数字,则您的生产代码必须在某个地方引发异常- 02/31/2013不应被接受!

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

代码语言:javascript
运行
复制
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。他们有一个奇妙的日期时间解析器,它吞噬了你扔给它的几乎所有东西。示例:

代码语言:javascript
运行
复制
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")

输出:

代码语言:javascript
运行
复制
 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有大量的单元测试,而且“只是会工作”。你能写的最好的代码就是你不需要测试的代码。

票数 2
EN

Stack Overflow用户

发布于 2013-09-04 10:11:16

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

例如:

代码语言:javascript
运行
复制
date = raw_input("Enter date (mm/dd/yyyy): ")

现在使用strptime()检查它是否正确:

代码语言:javascript
运行
复制
try:
  date = time.strptime(date, '%m/%d/%Y')
except ValueError:
  print('Invalid date!')

参考资料:

http://docs.python.org/2/library/time.html#time.strptime

How can I validate a date in Python 3.x?

票数 0
EN

Stack Overflow用户

发布于 2013-09-04 10:20:16

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

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18610884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档