首页 > 其他 > 详细

识别指定格式的时间

时间:2020-02-24 12:58:00      阅读:80      评论:0      收藏:0      [点我收藏+]
  • 此题目为一个面试题,如下:
  • 技术分享图片

     

     

  • 实现代码如下:
  • import re
    
    # 英文周几对照
    dic_week = {
        Mon: 1,      Tues: 2,       Wed: 3,
        Thur: 4,     Fri: 5,        Sat: 6,     Sun: 7,
    }
    # 英文月份对照
    dic_month = {
        January: 1,      jan: 1,    Jan: 1,
        February: 2,     feb: 2,    Feb: 2,
        March: 3,        mar: 3,    Mar: 3,
        April: 4,        apr: 4,    Apr: 4,
        May: 5,          may: 5,  # ‘May‘: 5,
        June: 6,         jun: 6,    Jun: 6,
        July: 7,         jul: 7,    Jul: 7,
        August: 8,       aug: 8,    Aug: 8,
        September: 9,   sept: 9,   Sept: 9,
        October: 10,    oct: 10,   Oct: 10,
        November: 11,   nov: 11,   Nov: 11,
        December: 12,   dec: 12,   Dec: 12,
    }
    # 时区
    li_time_zone = [+1400, +1300, +1200, +1100, +1000, +0900, +0800, +0700, +0600,
                    +0500, +0400, +0300, +0200, +0100, +0000, -0100, -0200, -0300,
                    -0400, -0500, -0600, -0700, -0800, -0900, -1000, -1100, -1200]
    # 将月份按天数分开
    thirty_one_days_mouth = [1, 3, 5, 7, 8, 10, 12]
    thirty_days_mouth = [4, 6, 9, 11]
    twenty_nine_days_mouth = [2]
    
    # 获取用户输入的日期(按2019/11/01 10:07:25格式检查)
    inp_date = input(请输入您需要检查的日期: )
    # 获取日期中数字
    find_number = re.compile(r\d+)
    get_numbers = find_number.findall(inp_date)
    # 获取输入日期里的字母(月份,周几和‘am/pm‘)
    find_letter = re.compile(r[A-Za-z]+)
    get_letter = find_letter.findall(inp_date)
    # 其他格式日期转化为‘2019/11/01 10:07:25’格式
    
    
    def change_format():
        # 检查格式为‘2019/11/11’的日期
        if len(get_numbers) == 3:
            for a in range(0, 3):
                get_numbers.append(0)
        # 检查格式为‘September 17, 2012 10:09 am’的日期
        elif len(get_numbers) == 4:
            # 将get_numbers里‘年’和‘天’位置互换,转换为‘2019/11/01 10:07:25’格式
            get_numbers[0], get_numbers[1] = get_numbers[1], get_numbers[0]
            if get_letter[0] in dic_month:
                get_numbers.insert(1, dic_month[get_letter[0]])  # 将月份转化成数字月份并放入get_numbers指定位置
                get_numbers.append(0)  # 将秒数位置加上,防止格式不正确
                if get_letter[1] == amor get_letter[1] == pm:
                    if int(get_numbers[3]) not in range(0, 12):
                        get_numbers[3] = 25
                    else:
                        pass
                else:
                    get_numbers[3] = 25
            else:
                for a in range(0, 2):
                    get_numbers.append(100)
        # 检查格式为‘"oct 7, 1970 5:57:51 PM"、"12 Feb 2006, 19:17:09"、"Mon, 02 Jan 2006 15:04:05"’的日期
        elif len(get_numbers) == 5:
            # 将get_numbers里‘年’和‘天’位置互换,转换为‘2019/11/01 10:07:25’格式
            get_numbers[0], get_numbers[1] = get_numbers[1], get_numbers[0]
            if len(get_letter) == 1:  # 对"12 Feb 2006, 19:17:09"格式检查
                if get_letter[0] in dic_month:
                    get_numbers.insert(1, dic_month[get_letter[0]])  # 将月份转化成数字月份并放入get_numbers指定位置
                else:
                    get_numbers.append(100)
            elif len(get_letter) == 2:
                if get_letter[0] in dic_month:  # 对"oct 7, 1970 5:57:51 PM"格式检查
                    get_numbers.insert(1, dic_month[get_letter[0]])  # 将月份转化成数字月份并放入get_numbers指定位置
                    if get_letter[1] == AMor get_letter[1] == PM:
                        if int(get_numbers[3]) not in range(0, 12):
                            get_numbers[3] = 25
                        else:
                            pass
                    else:
                        get_numbers[3] = 25
                elif get_letter[0] in dic_week:  # 对"Mon, 02 Jan 2006 15:04:05"格式检查
                    if get_letter[1] in dic_month:
                        get_numbers.insert(1, dic_month[get_letter[1]])  # 将月份转化成数字月份并放入get_numbers指定位置
                        # 检查周几是否正确
    
                        def check_week():
                            sum_days = 0
                            # 1900年起以年为单位计算天数
                            for i in range(1900, int(get_numbers[0])):
                                if (i % 4 == 0 and i % 100 != 0) or i % 400 == 0:
                                    sum_days += 366
                                else:
                                    sum_days += 365
                            # 一月起以月为单位计算天数
                            for i in range(1, int(get_numbers[1])):
                                if i in thirty_one_days_mouth:
                                    sum_days += 31
                                elif i in thirty_days_mouth:
                                    sum_days += 30
                                elif i in twenty_nine_days_mouth:
                                    if (get_numbers[0] % 4 == 0 and get_numbers[0] % 100 != 0) or get_numbers[0] % 400 == 0:
                                        sum_days += 29
                                    else:
                                        sum_days += 28
                                else:
                                    get_numbers[3] = 25
                            # 以日为单位计算天数
                            sum_days += int(get_numbers[2])
                            # 将日期对应的周几算出来并与输入的周几对比
                            week_day = 1+(sum_days-1) % 7
                            if week_day == dic_week[get_letter[0]]:
                                pass
                            else:
                                get_numbers[3] = 25
                        check_week()
                    else:
                        get_numbers.append(100)
                else:
                    get_numbers.append(100)
            else:
                get_numbers.append(100)
        # 检查格式为‘"2019/11/01 10:07:25"、"2019/11/01 10:07:25 AM"、"2014-12-16 06:20:00 UTC、"2014-12-16 06:20:00 GMT’的日期
        elif len(get_numbers) == 6:
            if len(get_letter) == 0:
                pass
            elif len(get_letter) == 1:
                if get_letter[0] == AMor get_letter[0] == PM:
                    if int(get_numbers[3]) not in range(0, 12):
                        get_numbers[3] = 25
                    else:
                        pass
                elif get_letter[0] == GMTor get_letter[0] == UTC:
                    pass
                else:
                    get_numbers[3] = 25
            else:
                get_numbers[3] = 25
        # 检查格式为‘2014-12-16 06:20:00 +0800 UTC’的日期
        elif len(get_numbers) == 7:
            if get_letter[0] == UTC:
                find_time_zone_number = re.compile(r[+|-]\d+)
                get_time_zone_numbers = find_time_zone_number.findall(inp_date)
                if get_time_zone_numbers[2] in li_time_zone:
                    pass
                else:
                    get_numbers[3] = 25
            else:
                get_numbers[3] = 25
        # 对其他格式进行处理,防止下方代码报错
        else:
            for a in range(0, 7):
                get_numbers.append(100)
    
    
    change_format()
    # 获取日期的年月日时分秒:(按2019/11/01 10:07:25格式)
    che_year = int(get_numbers[0])
    che_month = int(get_numbers[1])
    che_day = int(get_numbers[2])
    che_hour = int(get_numbers[3])
    che_minute = int(get_numbers[4])
    che_second = int(get_numbers[5])
    # 对年月日进行检查:
    
    
    def check_year_mouth_day():
        if che_month in thirty_one_days_mouth:
            if che_day in range(1, 32):
                return True
            else:
                return False
        elif che_month in thirty_days_mouth:
            if che_day in range(1, 31):
                return True
            else:
                return False
        elif che_month in twenty_nine_days_mouth:
            if (che_year % 4 == 0 & che_year % 100 != 0) or (che_year % 400 == 0):  # 检查是否为闰年
                if che_day in range(1, 30):
                    return True
                else:
                    return False
            else:
                if che_day in range(1, 29):
                    return True
                else:
                    return False
        else:
            return False
    
    # 对时分秒进行检查:
    # 只需要检查0≤小时≤23,0≤分钟(秒)≤59
    
    
    def check_hour_minute_second():
        if (che_hour in range(0, 24)) & (che_minute in range(0, 60)) & (che_second in range(0, 60)):
            return True
        else:
            return False
    # 执行检查年月日,时分秒函数并返回结果
    
    
    check_year_mouth_day()
    check_hour_minute_second()
    if check_year_mouth_day() & check_hour_minute_second():
        print("您要检查的日期是合法的")
    else:
        print("您要检查的日期是违规的")

     

识别指定格式的时间

原文:https://www.cnblogs.com/itheone/p/12355977.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!