跳至主要內容

1507. 转变日期格式


1507. 转变日期格式

🟢   🔖  字符串  🔗 力扣open in new window LeetCodeopen in new window

题目

Given a date string in the form Day Month Year, where:

  • Day is in the set {"1st", "2nd", "3rd", "4th", ..., "30th", "31st"}.
  • Month is in the set {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}.
  • Year is in the range [1900, 2100].

Convert the date string to the format YYYY-MM-DD, where:

  • YYYY denotes the 4 digit year.
  • MM denotes the 2 digit month.
  • DD denotes the 2 digit day.

Example 1:

Input: date = "20th Oct 2052"

Output: "2052-10-20"

Example 2:

Input: date = "6th Jun 1933"

Output: "1933-06-06"

Example 3:

Input: date = "26th May 1960"

Output: "1960-05-26"

Constraints:

  • The given dates are guaranteed to be valid, so no error handling is necessary.

题目大意

给你一个字符串 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"

提示:

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

解题思路

  1. 月份映射:使用对象 months 将月份的英文缩写映射到对应的数字(例如 "Jan" 映射为 "01")。这样做可以方便快速查找。
  2. 拆分日期:通过 split(' ') 将日期字符串拆分为 daymonthyear
  3. 处理日期的后缀:使用 slice(0, day.length - 2) 去除日期中的后缀(如 stndrdth)。
  4. 补零处理:确保日期总是两位数,如果日期只有一位数(如 1),则在前面加上零。
  5. 返回格式化后的日期:通过模板字符串,将 yearmonthday 组合成所需的 "yyyy-mm-dd" 格式返回。

复杂度分析

  • 时间复杂度O(1),对日期进行切割和字符串操作的时间复杂度是 O(1),因为只涉及固定长度的字符串。
  • 空间复杂度O(1)months 对象是常量大小的映射。

代码

/**
 * @param {string} date
 * @return {string}
 */
var reformatDate = function (date) {
	// 将月份的英文缩写与数字对应起来
	const months = {
		Jan: '01',
		Feb: '02',
		Mar: '03',
		Apr: '04',
		May: '05',
		Jun: '06',
		Jul: '07',
		Aug: '08',
		Sep: '09',
		Oct: '10',
		Nov: '11',
		Dec: '12'
	};

	// 拆分输入日期
	let [day, month, year] = date.split(' ');

	// 去掉日期中的后缀(例如 "1st" -> "1")
	day = day.slice(0, day.length - 2);

	// 如果日期是单数,则前面补零
	if (day.length < 2) {
		day = '0' + day;
	}

	// 返回按要求格式化后的日期
	return `${year}-${months[month]}-${day}`;
};