サイトアイコン わんすけに聞いてみる

JavascriptのDate型を和暦対応させてみる。

前回に引き続き、JavascriptのDate型に優しさを加えるサンプルコード

Date型のコンストラクタにそのまま突っ込んでも「Invalid Date」になってしまう日付書式を強制的にDate型へ変換する関数を作ってみました。

ひとまず、Date型のコンストラクタにぶっこんで「Invalid 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");

 

 

 

モバイルバージョンを終了