Skip to content

Instantly share code, notes, and snippets.

@think49
Last active May 24, 2018 14:52
Show Gist options
  • Save think49/809f36e82806e9a6f85ad3e115f6bf35 to your computer and use it in GitHub Desktop.
Save think49/809f36e82806e9a6f85ad3e115f6bf35 to your computer and use it in GitHub Desktop.
parse-date-string.js

parse-date-string.js

概要

YYYY-MM-DD hh:mm:ss 形式の文字列を解析し、Date オブジェクトに変換します。

使用可能な書式

書式 説明
YYYY 4桁で構成される「年」を表します。
YY 2桁で構成される「年」を表します。今年の上2桁の数値を補完した「年」として扱われます。
Y 1~4桁で構成される「年」を表します。
MM 2桁で構成される「月」を表します。
M 1~2桁で構成される「月」を表します。
DD 2桁で構成される「日」を表します。
D 1~2桁で構成される「日」を表します。
hh 2桁で構成される「時間」を表します。
h 1~2桁で構成される「時間」を表します。
mm 2桁で構成される「分」を表します。
m 1~2桁で構成される「分」を表します。
ss 2桁で構成される「秒」を表します。
s 1~2桁で構成される「秒」を表します。

使い方

parseDateString ( formatString, dateString)

第一引数に「書式文字列」、第二引数の「日付文字列」を指定する事で、Date オブジェクトに変換します。

var date1 = parseDateString('YYYY-MM-DDThh:mm:ss', '2018-11-03T12:01:34');

console.log(date1.getFullYear(), date1.getMonth(), date1.getDate(), date1.getHours(), date1.getMinutes(), date1.getSeconds());  // 2018 10 3 12 1 34

new Date と同様に書式は後ろから自由な範囲を省略することが出来ます。

var date2 = parseDateString('Y/M/D', '2012/12/3');

console.log(date2.getFullYear(), date2.getMonth(), date2.getDate(), date2.getHours(), date2.getMinutes(), date2.getSeconds());  // 2012 11 3 0 0 0

YY が指定された時、「今年」の上2桁の数値を補完した「年」として扱われます。下記は今年が「20XX年」の場合の結果です。今年が「21XX年」ならば、2100 が返ります。

var date3 = parseDateString('YY/MM/DD', '00/12/11');

console.log(date3.getFullYear());  // 2000

参考リンク

/**
* parse-date-string-1.0.0.js
* Parse Date String (YYYY-MM-DD hh:mm:ss).
*
* @version 1.0.0
* @author think49
* @license http://www.opensource.org/licenses/mit-license.php (The MIT License)
* @url https://gist.github.com/think49/809f36e82806e9a6f85ad3e115f6bf35
*/
'use strict';
var parseDateString = (function (String, RegExp, Date) {
function escapeRegExpChar (string) {
return String(string).replace(/(?=[$()*+\-.?\[\]^{|}])/g, '\\');
}
return function parseDateString (formatString, dateString) {
var formatReg = /(YYYY|YY?)|(MM?)|(DD?)|(hh?)|(mm?)|(ss?)|([^YMDhms]+)|([\s\S])/g,
dateRegStr = '^',
dateResultIndexList = [],
dateResultIndex = 0,
useHalfYear,
formatResult, i;
formatString = String(formatString);
dateString = String(dateString);
while (formatResult = formatReg.exec(formatString)) {
if (formatResult[1]) {
if (!dateResultIndexList[0]) {
i = formatResult[1].length;
useHalfYear = i === 2;
switch (i) {
case 4:
dateRegStr += '(\\d{4})';
break;
case 2:
dateRegStr += '(\\d{2})';
break;
case 1:
dateRegStr += '(\\d{1,4})';
break;
}
dateResultIndexList[0] = ++dateResultIndex;
} else {
dateStr += escapeRegExpChar(formatResult[1]);
}
} else {
for (var i = 2, len; i < 7; ++i) {
if (formatResult[i]) {
if (!dateResultIndexList[i - 1]) {
len = formatResult[i].length;
dateRegStr += len === 2 ? '(\\d{2})' : '(\\d{1,2})';
dateResultIndexList[i - 1] = ++dateResultIndex;
} else {
dateRegStr += escapeRegExpChar(formatResult[i]);
}
break;
}
}
if (i === 7) {
dateRegStr += escapeRegExpChar(formatResult[7] || formatResult[8]);
}
}
}
var dateResult = new RegExp(dateRegStr + '$', 'g').exec(dateString),
year = dateResult[dateResultIndexList[0]],
args = [useHalfYear ? new Date().getFullYear().toString().slice(0,2) + year : year];
args[1] = dateResult[dateResultIndexList[1]] - 1;
for (var i = 2, len = dateResultIndexList.length; i < len; ++i) {
args[i] = dateResult[dateResultIndexList[i]];
}
return new Date(...args);
}
}(String, RegExp, Date));
<!DOCTYPE html>
<head>
<meta charset="UTF-8" />
<title>test</title>
<style>
</style>
</head>
<body>
<script src="parse-date-string-1.0.0.js"></script>
<script>
'use strict';
var date1 = parseDateString('YYYYMMDD', '20180524');
console.assert(date1.getFullYear() === 2018);
console.assert(date1.getMonth() == 4);
console.assert(date1.getDate() === 24);
var date2 = parseDateString('YYMMDD', '180101');
console.assert(date2.getFullYear() === 2018);
console.assert(date2.getMonth() == 0);
console.assert(date2.getDate() === 1);
var date3 = parseDateString('YYYY-MM-DDThh:mm:ss', '2018-11-03T12:01:34');
console.assert(date3.getFullYear() === 2018);
console.assert(date3.getMonth() == 10);
console.assert(date3.getDate() === 3);
console.assert(date3.getHours() === 12);
console.assert(date3.getMinutes() === 1);
console.assert(date3.getSeconds() === 34);
var date4 = parseDateString('Y-M-DTh:m:s', '1908-8-03T11:31:29');
console.assert(date4.getFullYear() === 1908);
console.assert(date4.getMonth() == 7);
console.assert(date4.getDate() === 3);
console.assert(date4.getHours() === 11);
console.assert(date4.getMinutes() === 31);
console.assert(date4.getSeconds() === 29);
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment