【JavaScript】日時と時間をフォーマットする

簡易のフォーマット処理関数です。

日時フォーマット

dateFormat.js/**
 * 日時のフォーマット
 * @param {string} format - フォーマット文字列
 * @param {(Date|number|string)} [opt_date=new Date()] - 日時
 * @param {string} [opt_prefix=''] - 前置語(例:'$'の場合、format='$yyyy/$MM/$dd')
 * @param {string} [opt_prefix=''] - 接尾語(例:'$'の場合、format='yyyy$/MM$/dd$')
 * @return {string} 書式文字列
 */
function dateFormat(format, opt_date, opt_prefix, opt_suffix) {
  var pre = opt_prefix != null ? opt_prefix : '';
  var suf = opt_suffix != null ? opt_suffix : '';
  var fmt = {};
  fmt[pre+'yyyy'+suf] = function(date) { return ''  + date.getFullYear(); };
  fmt[pre+'MM'+suf]   = function(date) { return('0' +(date.getMonth() + 1)).slice(-2); };
  fmt[pre+'dd'+suf]   = function(date) { return('0' + date.getDate()).slice(-2); };
  fmt[pre+'hh'+suf]   = function(date) { return('0' +(date.getHours() % 12)).slice(-2); };
  fmt[pre+'HH'+suf]   = function(date) { return('0' + date.getHours()).slice(-2); };
  fmt[pre+'mm'+suf]   = function(date) { return('0' + date.getMinutes()).slice(-2); };
  fmt[pre+'ss'+suf]   = function(date) { return('0' + date.getSeconds()).slice(-2); };
  fmt[pre+'SSS'+suf]  = function(date) { return('00'+ date.getMilliseconds()).slice(-3); };
  fmt[pre+'yy'+suf]   = function(date) { return(''  + date.getFullYear()).slice(-2); };
  fmt[pre+'M'+suf]    = function(date) { return ''  +(date.getMonth() + 1); };
  fmt[pre+'d'+suf]    = function(date) { return ''  + date.getDate(); };
  fmt[pre+'h'+suf]    = function(date) { return ''  +(date.getHours() % 12); };
  fmt[pre+'H'+suf]    = function(date) { return ''  + date.getHours(); };
  fmt[pre+'m'+suf]    = function(date) { return ''  + date.getMinutes(); };
  fmt[pre+'s'+suf]    = function(date) { return ''  + date.getSeconds(); };
  fmt[pre+'S'+suf]    = function(date) { return ''  + date.getMilliseconds(); };

  var date = opt_date;
  if (date == null) {
    date = new Date();
  } else if (typeof date === 'number' && isFinite(date) && Math.floor(date) === date) {
    date = new Date(date);
  } else if (Object.prototype.toString.call(date) === '[object String]') {
    date = new Date(date);
  }

  var result = format;
  for (var key in fmt) {
    if (fmt.hasOwnProperty(key)) {
      result = result.replace(key, fmt[key](date));
    }
  }
  return result;
};

動作例

dateFormat('yyyy/MM/dd hh:mm:ss.SSS');
// 2018/05/30 02:01:10.094

dateFormat('${yyyy}年${MM}月${dd}日', new Date(), '${', '}');
// 2018年05月30日

時間フォーマット

timeFormat.js/**
 * 時間のフォーマット
 * @param {string} format - フォーマット文字列
 * @param {number} time - 時間(ms単位)
 * @param {string} [opt_prefix=''] - 前置語(例:'$'の場合、format='$~H:$mm:$ss.$S')
 * @param {string} [opt_prefix=''] - 接尾語(例:'$'の場合、format='~H$:mm$:ss$.S$')
 * @return {string} 書式文字列
 */
function timeFormat(format, time, opt_prefix, opt_suffix) {
  var pre = opt_prefix != null ? opt_prefix : '';
  var suf = opt_suffix != null ? opt_suffix : '';
  var fmt = {};
  fmt[pre+'~d'+suf] = function(time) { return ''  + Math.floor(time/86400000);  };
  fmt[pre+'~H'+suf] = function(time) { return ''  + Math.floor(time/3600000); };
  fmt[pre+'~h'+suf] = function(time) { return ''  + Math.floor(time/1800000); };
  fmt[pre+'~m'+suf] = function(time) { return ''  + Math.floor(time/60000); };
  fmt[pre+'~s'+suf] = function(time) { return ''  + Math.floor(time/1000);  };
  fmt[pre+'~S'+suf] = function(time) { return ''  +(time);  };
  fmt[pre+'HH'+suf] = function(time) { return('0' +(Math.floor(time/3600000)%24)).slice(-2);  };
  fmt[pre+'hh'+suf] = function(time) { return('0' +(Math.floor(time/1800000)%24)).slice(-2);  };
  fmt[pre+'mm'+suf] = function(time) { return('0' +(Math.floor(time/60000)%60)).slice(-2);  };
  fmt[pre+'ss'+suf] = function(time) { return('0' +(Math.floor(time/1000)%60)).slice(-2); };
  fmt[pre+'SSS'+suf]= function(time) { return('00'+(time%1000)).slice(-3);  };
  fmt[pre+'d'+suf]  = fmt[pre+'~d'+suf];
  fmt[pre+'H'+suf]  = function(time) { return ''  +(Math.floor(time/3600000)%24); };
  fmt[pre+'h'+suf]  = function(time) { return ''  +(Math.floor(time/1800000)%24); };
  fmt[pre+'m'+suf]  = function(time) { return ''  +(Math.floor(time/60000)%60); };
  fmt[pre+'s'+suf]  = function(time) { return ''  +(Math.floor(time/1000)%60);  };
  fmt[pre+'S'+suf]  = function(time) { return ''  +(time%1000); };

  var result = format;
  for (var key in fmt) {
    if (fmt.hasOwnProperty(key)) {
      result = result.replace(key, fmt[key](time));
    }
  }
  return result;
};

動作例

timeFormat('~H:mm:ss.S', 12*1000+345);
// 0:00:12.345

var time = 1;
time = time*24 + 2;
time = time*60 + 34;
time = time*60 + 56;
time = time*1000 + 78;
timeFormat('${~H}:${mm}:${ss}.${S}', time, '${', '}');
// 26:34:56.78