【问题标题】:What are some ways to parse date/time from user input? [duplicate]有哪些方法可以从用户输入中解析日期/时间? [复制]
【发布时间】:2021-06-16 22:49:02
【问题描述】:
class Date:
    def __init__(self, digits):   #digits='10/20/21'
        self.month = digits[:2]  #'10'
        self.day = digits[3:5]   #'20'
        self.year = digits[6:8]  #'21'

    def __str__(self):
        return f"Dated this {self.day} day of {self.month}, 20{self.year}"

def checkday(date):        #add 'st', 'nd', 'rd', or 'th' to day
    if int(date.day) == 1 or int(date.day) == 21 or int(date.day) == 31:
        date.day += 'st'
    elif int(date.day) == 2 or int(date.day) == 22:
        date.day += 'nd'
    elif int(date.day) == 3 or int(date.day) == 23:
        date.day += 'rd'
    else:
        date.day += 'th'

def checkmonth(date):     #get name of month
    date.month = monthdic[date.month]

months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'Jul', 'Aug', 'Sep', 'Oct','Nov', 'Dec']
monthdic = {str(i): month for i, month in zip(range(1,13), months)}

date = Date(input("Enter date (mm/dd/yy):\t"))
checkday(date)
checkmonth(date)

print(date)

几个错误归结为一个我没有想到的问题:

如果是一月:1/12/14 将不起作用,因为 self.month1/12/14[:2]

Enter date (mm/dd/yy):  1/12/14
Traceback (most recent call last):
  File "date.py", line 38, in <module>
    checkday(date)
  File "date.py", line 14, in checkday
    if int(date.day) == 1 or int(date.day) == 21 or int(date.day) == 31:
ValueError: invalid literal for int() with base 10: '2/'

如果我求助于01/12/14,这也行不通,因为01'01'monthdic['01'] 不存在:

Enter date (mm/dd/yy):  01/12/14
Traceback (most recent call last):
  File "date.py", line 39, in <module>
    checkmonth(date)
  File "date.py", line 28, in checkmonth
    date.month = monthdic[date.month]
KeyError: '01'

显然

def __init__(self, digits):
    self.month = digits[:2]
    self.day = digits[3:5]
    self.year = digits[6:8]

不是最好的方法,有什么好的方法(除了正则表达式)?

还有一件事:在__init__ 中调用checkdate()checkmonth 是否合适?

【问题讨论】:

  • self.month, self.day, self.year = map(int, digits.split("/"))?
  • datetime.datetime.strptime() 是将字符串解析为日期的规范方法。我不知道其他人。
  • @wjandrea 不,这不能回答我的问题。 if date.day.endswith('1'): date.day += 'st' 也不起作用:'12nd''13rd'
  • @rain 它怎么不回答你的问题?
  • @rain 哎呀,我忘了这些。我删除了我的评论。

标签: python python-3.x datetime user-input


【解决方案1】:

最好的方法是拆分方法。您可以根据'/' 拆分正在输入的文本。所以,像1/12/14 这样的东西会变成[1, 12, 14]。其余的很简单。

class Date:
    def __init__(self, digits):
        split = digits.split('/')
        self.month = split[0]
        self.day = split[1]
        self.year = split[2]

    def __str__(self):
        return f"Dated this {self.day} day of {self.month}, {self.year}"

【讨论】:

    【解决方案2】:

    作为@MuhameedJaseem suggested: split = digits.split('/') 并与split 合作。还像许多人建议的那样改进了代码。代码现在更优雅了。

    class Date:
        def __init__(self, digits):
            self.month, self.day, self.year = digits.split('/')
    
    
        def __str__(self):
            return f"Dated this {self.day} day of {self.month}, {self.year}"
    
    
    
    def checkday(date):
    
        if date.day[-1] == '1' and date.day[0] != '1':
            date.day += 'st'
    
        elif date.day[-1] == '2' and date.day[0] != '1':
            date.day += 'nd'
    
        elif date.day[-1] == '3' and date.day[0] != '1':
            date.day += 'rd'
    
        else:
            date.day += 'th'
    
    
    def checkmonth(date):
        date.month = monthdic[date.month]
    
    
    months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'Jul', 'Aug', 'Sep', 'Oct','Nov', 'Dec']
    
    monthdic = {str(i): month for i, month in zip(range(1,13), months)}
    
    
    
    date = Date(input("Enter date (m/d/y):\t"))
    checkday(date)
    checkmonth(date)
    

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 2012-09-07
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多