转变日期格式

115 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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('-');
};

说在后面

本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。