开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 34 天,点击查看活动详情
问题描述
给你一个字符串 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"
提示:
- 给定日期保证是合法的,所以不需要处理异常输入。
思路分析
首先我们要先理解一下题目的意思,题目会给我们一个代表日期的字符串,字符串的格式为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 的时间格式返回。
如:date = "20th Oct 2052"我们应该将其转换为2052-10-20
我们可以分别分析每一部分日期的规律:
- 年
题目给出的是一个合法的年份数字,我们不需要进行额外的计算,可以直接返回。
- 月
题目给出的月份是一个英文缩写的月份字符串,我们需要将其转换成数字的月份,我们只需要将月份数字和英文缩写对应起来即可,如可以使用一个数组来对应记录每个月份
const month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
转换成数字时,我们只需要取其下标加一即可,还需要注意对一位数的月份进行补零操作。
- 日
题目给出的天数是数字加一个英文后缀,这里我们不难发现,只需要将英文后缀去掉即可,还需要注意对一位数的天数进行补零操作。
AC 代码
完整代码如下:
/**
* @param {string} date
* @return {string}
*/
var reformatDate = function(date) {
const month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
date = date.split(' ');
date[0] = parseInt(date[0]);
date[0] = date[0] > 9 ? date[0] : ('0' + date[0]);
date[1] = month.indexOf(date[1]) + 1;
date[1] = date[1] > 9 ? date[1] : ('0' + date[1]);
return date.reverse().join('-');
};
说在后面
本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。