わんすけに聞いてみる Javascript,サンプルコード JavascriptのDate型を和暦対応させてみる。

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

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

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Related Post

編集したTableの値に循環参照が発生していないかチェックしてみる。編集したTableの値に循環参照が発生していないかチェックしてみる。

さて、今回は編集可能にしたTableに関数を実装していく前に循環参照を検出しようというところ。 編集中のセルからフォーカスアウトした時に発火するイベントにチェックを仕込みます。 循環参照のチェックを開始する部分 $("# […]