初学者Python:"尝试/除错误"打印不正确

时间:2017-09-12 18:25:39

标签: python

以下是我的代码。目标是将日期输入转换为虚线格式(例如01-01-2001)。转换日期后,应打印日期。但是,如果日期难以理解或不是有效输入,则应打印"不是有效日期"并返回无。现在,即使是正确的日期输入,它也只返回None。转换脚本在之前的任务中使用并且运行正常,因此我确实认为问题出在' try / except'块。

测试输入:

print(date_conversion_robust('19/8/16'))---> 19-08-2016

print(date_conversion_robust('1/12/1898'))---> 01-12-1898

print(date_conversion_robust('16/3/18'))---> 16-03-1918

print(date_conversion_robust('29/2/2017'))---> Not a valid date. None

print(date_conversion_robust('131/2/1928'))---> Not a valid date. None

print(date_conversion_robust(2))---> Not a valid date. None

谢谢!

#Convert date inputs
def convert_day(day_string):
    if int(day_string) < 10:
        return (day_string).zfill(2)
    else:
        return day_string

def convert_month(month_string):
    if int(month_string) < 10:
        return (month_string).zfill(2)
    else:
        return month_string

def convert_year(year_string):
    if int(year_string) < 18:
        return('20'+(year_string))
    elif int(year_string) < 99:
        if int(year_string) >= 18:
            return('19'+(year_string))
    else:
        return year_string


#form date string 
def date_conversion(date_string):
    date_as_list = date_string.split('/')
    a = convert_day(date_as_list[0])
    b = convert_month(date_as_list[1])
    c = convert_year(date_as_list[2])
    try:
        L = [a, b, c]
        return('-'.join(L))
    except(AttributeError, SyntaxError, TypeError):
        print('Not a valid date.')
        return None

3 个答案:

答案 0 :(得分:0)

Python具有标准库中包含的日期解析和日期格式化功能。为什么不直接使用它们?

import datetime

def date_conversion(date_string):
  try:
    dt = datetime.datetime.strptime(date_string, '%d/%m/%y')
  except ValueError:  # invalid input string
    return None
  if dt.year >= 2018: 
    dt = dt.replace(year=dt.year - 100)  # change century
  return dt.strftime('%d-%m-%Y')

通过使用此功能,您还可以确保拒绝非实际日期(例如35/01/78)的输入。

此处记录了datetime格式字符串的用法:https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior

答案 1 :(得分:0)

您正在采取一些额外步骤,并且您正在跳过一些步骤。验证日期和/或处理不同的日期格式是棘手的部分,而您却没有这样做:分隔符/-.?它是dd-mm-yyyy还是mm-dd-yyyy或其他无数格式之一? (如果您从具有已知格式的来源中拉出来可能不是问题,但如果您期望人类日期输入肯定会出现问题)。您的组件转换功能不必有条件地调用.zfill(),即'12'.zfill(2)不是错误 - 这意味着您根本不需要此功能。你的尝试/除了似乎是错误的:它应该真正围绕验证输入,一旦你有三个元素,它不会失败加入他们创建回报。您可以轻松使用字符串格式。等等。

如上所述,使用模块进行日期操作似乎是要走的路!

答案 2 :(得分:0)

除了工作之外,它应该是

except ValueError: 

而不是

except(AttributeError, SyntaxError, TypeError):

以下功能应该可以正常工作:

# Convert date inputs
def convert_day(day_string):
    if int(day_string) < 10:
        return (day_string).zfill(2)
    else:
        return day_string


def convert_month(month_string):
    if int(month_string) < 10:
        return (month_string).zfill(2)
    else:
        return month_string


def convert_year(year_string):
    if int(year_string) < 18:
        return('20'+(year_string))
    elif int(year_string) < 99:
        if int(year_string) >= 18:
            return('19'+(year_string))
    else:
        return year_string


# form date string

def date_conversion(date_string):
    try:
        date_as_list = date_string.split('/')
        a = convert_day(date_as_list[0])
        b = convert_month(date_as_list[1])
        c = convert_year(date_as_list[2])

        k = a + '-' + b + '-' + c
        print(k)

    except ValueError:
        print('Not a valid date.')
        # return None
# 2 Test cases
date_conversion('19/8/16')
date_conversion('asfsdfggdf')

上面代码的结果将是

19-08-2016
Not a valid date.

Process finished with exit code 0