前回に引き続き、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");