转变日期格式

标签: 字符串

难度: Easy

给你一个字符串 date ,它的格式为 Day Month Year ,其中:

  • Day 是集合 {"1st", "2nd", "3rd", "4th", ..., "30th", "31st"} 中的一个元素。
  • Month 是集合 {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"} 中的一个元素。
  • Year 的范围在 ​[1900, 2100] 之间。

请你将字符串转变为 YYYY-MM-DD 的格式,其中:

  • YYYY 表示 4 位的年份。
  • MM 表示 2 位的月份。
  • DD 表示 2 位的天数。

示例 1:

输入:date = "20th Oct 2052"
输出:"2052-10-20"

示例 2:

输入:date = "6th Jun 1933"
输出:"1933-06-06"

示例 3:

输入:date = "26th May 1960"
输出:"1960-05-26"

提示:

  • 给定日期保证是合法的,所以不需要处理异常输入。

Submission

运行时间: 22 ms

内存: 16.0 MB

class Solution:
    def reformatDate(self, date: str) -> str:
        # 创建一个字典,将月份的缩写映射为对应的数字
        month_map = {
            "Jan": "01",
            "Feb": "02",
            "Mar": "03",
            "Apr": "04",
            "May": "05",
            "Jun": "06",
            "Jul": "07",
            "Aug": "08",
            "Sep": "09",
            "Oct": "10",
            "Nov": "11",
            "Dec": "12"
        }
        
        # 将日期字符串按空格分割成三个部分
        day, month, year = date.split()
        
        # 提取年份的最后四个数字
        year = year[-4:]
        
        # 根据月份的缩写查找对应的数字,并提取天数的最后两个数字(去掉后缀的"st"、"nd"、"rd"或"th")
        month = month_map[month]
        day = day[:-2] if len(day) == 4 else "0" + day[:-2]
        
        # 按照"YYYY-MM-DD"的格式拼接字符串并返回结果
        return f"{year}-{month}-{day}"

solution = Solution()
date1 = "20th Oct 2052"
print(solution.reformatDate(date1))  # 输出: "2052-10-20"

date2 = "6th Jun 1933"
print(solution.reformatDate(date2))  # 输出: "1933-06-06"

date3 = "26th May 1960"
print(solution.reformatDate(date3))  # 输出: "1960-05-26"

Explain

题解的思路是将输入的日期字符串按照空格分割为三个部分:天、月、年。首先,通过创建一个字典来映射每个月的缩写到其对应的两位数月份字符串。接着,对天和年进行字符串处理:年直接取后四位,天则去掉最后两个字符(如'st', 'nd', 'rd', 'th'),并在需要时在前面添加0以确保天总是两位数。最后,按照'YYYY-MM-DD'的格式将处理后的年、月、日组合成最终的字符串。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def reformatDate(self, date: str) -> str:
        # 创建一个字典,将月份的缩写映射为对应的数字
        month_map = {
            "Jan": "01",
            "Feb": "02",
            "Mar": "03",
            "Apr": "04",
            "May": "05",
            "Jun": "06",
            "Jul": "07",
            "Aug": "08",
            "Sep": "09",
            "Oct": "10",
            "Nov": "11",
            "Dec": "12"
        }
        
        # 将日期字符串按空格分割成三个部分
        day, month, year = date.split()
        
        # 提取年份的最后四个数字
        year = year[-4:]
        
        # 根据月份的缩写查找对应的数字,并提取天数的最后两个数字(去掉后缀的"st"、"nd"、"rd"或"th")
        month = month_map[month]
        day = day[:-2] if len(day) == 4 else "0" + day[:-2]
        
        # 按照"YYYY-MM-DD"的格式拼接字符串并返回结果
        return f"{year}-{month}-{day}"

solution = Solution()
date1 = "20th Oct 2052"
print(solution.reformatDate(date1))  # 输出: "2052-10-20"

date2 = "6th Jun 1933"
print(solution.reformatDate(date2))  # 输出: "1933-06-06"

date3 = "26th May 1960"
print(solution.reformatDate(date3))  # 输出: "1960-05-26"

Explore

在解决方案中,日期的天数部分的后缀('st', 'nd', 'rd', 'th')被统一处理。通过观察可以发现这些后缀长度固定为两个字符。因此,无论天数是一位数还是两位数,都可以通过简单地移除字符串最后两个字符来去除这些后缀。接着,检查处理后的天数字符串是否只有一位数字,如果是,则在其前面补充一个'0'以确保天总是以两位数表示。这样的处理适应了所有可能的后缀长度,且确保了天数格式的正确性。

在创建月份映射字典时,每个月份的缩写(如'Sep', 'Apr'等)都映射到一个固定的两位数字符串表示。例如,'Jan' 映射到 '01','Feb' 映射到 '02',依此类推。这样无论月份缩写的长度如何,映射后都会转换为标准的两位数月份格式。字典的设计保证了从任何有效的三字符月份缩写到其对应的两位数字符串的直接映射。

在Python中,字符串的`split()`方法在不带参数时默认以空白字符(包括空格、换行等)作为分隔符,并且会自动去除字符串开头和结尾的空白字符。因此,即使输入的日期字符串前后有额外的空格,使用`split()`方法仍然能正确地分割字符串为天、月、年三部分,不会影响最终结果。

当前的解决方案没有提供处理输入错误的机制。如果月份拼写错误,例如使用了不存在的缩写,那么尝试从`month_map`字典中获取对应值时将会导致KeyError异常。如果年份位数不正确,如不是四位数字,`year[-4:]`的操作虽然不会产生错误,但可能导致逻辑上的错误结果。为了提高程序的健壮性,可以在实现中添加异常处理逻辑,比如使用try-except块来捕获并处理这些潜在的输入错误,确保输入符合预期格式。