【问题标题】:Date validator / formatter returns None?日期验证器/格式化程序返回无?
【发布时间】:2021-01-05 02:10:13
【问题描述】:

我需要一个将日期字符串作为输入的函数,并验证输入的格式是否为 %m/%d%Y (MM/DD/YYYY) 或将给定日期重新格式化为该格式。但是,当我运行以下命令时,我打印:“日期为:无”。任何人都可以提供一些指导如何解决这个问题吗?非常感谢任何帮助!

import datetime

test_date = "08/19/2020"

def date_fixer(date_string):
    '''takes a date as input and reformats if needed.'''
    format = "%m/%d/%Y"
    date_string = str(date_string)
    try:
        datetime.datetime.strptime(date_string, format)
        print("This is the correct date string format.")
    except ValueError:
        print("This is the incorrect date string format. It should be %m/%d/%Y")
        #convert
        date_string = parse(str(date_string)).strftime('%m/%d/%Y')
        return(date_string)

date = date_fixer(test_date)
print("date is: " + str(date))

【问题讨论】:

  • 如果try 成功,date_fixer() 函数不会返回任何内容。因此它返回None。
  • 也许您的意思是取消缩进最后的return(date_string) 行,这样无论try 失败还是成功,它都会执行?

标签: python datetime datetime-format python-datetime


【解决方案1】:

返回在 except 块内,这就是为什么它在日期格式有效时返回 None 的原因。

您可以尝试以下方法吗:

import datetime

test_date = "08/19/2020"

def date_fixer(date_string):
    '''takes a date as input and reformats if needed.'''
    format = "%m/%d/%Y"
    date_string = str(date_string)
    try:
        datetime.datetime.strptime(date_string, format)
        print("This is the correct date string format.")
    except ValueError:
        print("This is the incorrect date string format. It should be %m/%d/%Y")
        #convert
        date_string = parse(str(date_string)).strftime('%m/%d/%Y')
    return(date_string)

date = date_fixer(test_date)
print("date is: " + str(date))

【讨论】:

  • 可能更清楚地说,问题在于没有return,而不是在哪里。您仍然可以在except 下拥有退货声明。
【解决方案2】:

您的代码中的错误已被其他人解释,但是,告知用户输入字符串是否符合预期格式是否重要?如果不是简单地在日期字符串上运行dateutil.parser.parse() 并返回一个重新格式化的字符串:

from dateutil.parser import parse

def date_fixer(date_string, format="%m/%d/%Y"):
    '''takes a date as input and reformats in the specified format.'''
    return parse(str(date_string)).strftime(format)

>>> date_fixer("08/19/2020")
'08/19/2020'
>>> date_fixer("19/08/2020")
'08/19/2020'
>>> date_fixer("2020-08-19")
'08/19/2020'
>>> date_fixer("08/19/2020", '%Y-%m-%d')    # override default format
'2020-08-19'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2020-08-19
    相关资源
    最近更新 更多