前回に引き続き、JavascriptのDate型に優しさを加えるサンプルコード
Date型のコンストラクタにそのまま突っ込んでも「Invalid Date」になってしまう日付書式を強制的にDate型へ変換する関数を作ってみました。
ひとまず、Date型のコンストラクタにぶっこんで「Invalid Date」で帰ってくる書式に対して以下の変換をトライします。
- yyyy年mm月dd日
- (和暦)yy年mm月dd日
- hh時nn分ss秒
- hh時nn分
- 午後 or p or pm or P or PM を含んでいたらhhに12加算
- 日付なしで時刻のみの書式の場合は1970/1/1 hh:nn:ssになる様にDate生成
コード
function CDate(dateStr){
var date = new Date(dateStr);
// コンストラクタが失敗したら解析開始
if (date.toString() === "Invalid Date"){
var mtch, gggg;
// 年月日
mtch = dateStr.match(/(\d{4})年(\d{1,2})月(\d{1,2})日/);
if(mtch) { date = new Date(mtch[1], parseInt(mtch[2],10)-1, mtch[3]); }
// 和暦
mtch = dateStr.match(/(M|T|S|H|明|大|昭|平|明治|大正|昭和|平成)(\d{1,2})年(\d{1,2})月(\d{1,2})日/);
if(mtch) {
gggg = (mtch[1].match(/M|明|明治/))?1868:(mtch[1].match(/T|大|大正/))?1912:(mtch[1].match(/S|昭|昭和/))?1926:1989;
date = new Date(gggg + parseInt(mtch[2],10)-1, parseInt(mtch[3],10)-1, mtch[4]);
}
// ここから時間の変換
var time;
var addPM = (dateStr.match(/p|pm|P|PM|午後/))?12:0;
mtch = dateStr.match(/(\d{1,2})(:|時)(\d{1,2})(:|分)(\d{1,2})秒{0,1}/);
if(mtch) {
time = new Date(1970, 0, 1, parseInt(mtch[1],10) + addPM, parseInt(mtch[3],10), parseInt(mtch[5], 10));
} else {
mtch = dateStr.match(/(\d{1,2})(:|時)(\d{1,2})分{0,1}/);
if (mtch) { time = new Date(1970, 0, 1, parseInt(mtch[1],10) + addPM, parseInt(mtch[3],10)); }
}
if (typeof(time) != "undefined") {
if (date.toString() === "Invalid Date"){
date = new Date(1970,0,1,time.getHours(),time.getMinutes(),time.getSeconds());
} else {
date = new Date(date.getFullYear(),date.getMonth(),date.getDate(),time.getHours(),time.getMinutes(),time.getSeconds());
}
}
}
return date;
}
使い方の一例
CDateに日付文字列を突っ込むだけです。
var rslt;
rslt = CDate("平成28年10月1日 午後3時15分");
rslt = CDate("2018年11月6日 10:30 AM");
rslt = CDate("2:30 PM");