LoginSignup
268
245

More than 5 years have passed since last update.

日付フォーマットなど 日付系処理

Last updated at Posted at 2014-02-16

日付をフォーマットする

日付をフォーマットして返す。フォーマット(第二引数)を省略した場合2014-01-23 01:23:45.678みたいな形で返す。

formatDate
/**
 * 日付をフォーマットする
 * @param  {Date}   date     日付
 * @param  {String} [format] フォーマット
 * @return {String}          フォーマット済み日付
 */
var formatDate = function (date, format) {
  if (!format) format = 'YYYY-MM-DD hh:mm:ss.SSS';
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2));
  format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2));
  format = format.replace(/hh/g, ('0' + date.getHours()).slice(-2));
  format = format.replace(/mm/g, ('0' + date.getMinutes()).slice(-2));
  format = format.replace(/ss/g, ('0' + date.getSeconds()).slice(-2));
  if (format.match(/S/g)) {
    var milliSeconds = ('00' + date.getMilliseconds()).slice(-3);
    var length = format.match(/S/g).length;
    for (var i = 0; i < length; i++) format = format.replace(/S/, milliSeconds.substring(i, i + 1));
  }
  return format;
};
e.g.
formatDate(new Date('2014/1/23'), 'MM月DD日'); // 01月23日

日付を加算する

ある日付に時間を加算した日付を返す。加算する単位(第三引数)を省略した場合、日付単位で加算する。

addDate
/**
 * 日付を加算する
 * @param  {Date}   date       日付
 * @param  {Number} num        加算数
 * @param  {String} [interval] 加算する単位
 * @return {Date}              加算後日付
 */
var addDate = function (date, num, interval) {
  switch (interval) {
    case 'YYYY':
      date.setYear(date.getYear() + num);
      break;
    case 'MM':
      date.setMonth(date.getMonth() + num);
      break;
    case 'hh':
      date.setHours(date.getHours() + num);
      break;
    case 'mm':
      date.setMinutes(date.getMinutes() + num);
      break;
    case 'ss':
      date.setSeconds(date.getSeconds() + num);
      break;
    default:
      date.setDate(date.getDate() + num);
  }
  return date;
};
e.g.
addDate(new Date('2014/1/23'), 1); // 2014/1/24
addDate(new Date('2014/2/23'), 1, 'MM'); // 2014/2/23 月が加算される

2つの日付の差を計算する

第二引数の日付から第一引数の日付を引いた差を数値で返す。差の単位(第三引数)を省略した場合、差を日付単位で返す。
単位以下の差は切り捨て(差がマイナスの場合は切り上げ)。

dateDiff
/**
 * 2つの日付の差を計算する
 * @param  {Date}   date1      日付1
 * @param  {Date}   date2      日付2
 * @param  {String} [interval] 差の単位
 * @return {Number}            2つの日付の差
 */
var dateDiff = function (date1, date2, interval) {
  var diff = date2.getTime() - date1.getTime();
  switch (interval) {
    case 'YYYY':
      var d1 = new Date(date1.getTime());
      var d2 = new Date(date2.getTime());
      d1.setYear(0);
      d2.setYear(0);
      var i;
      if (diff >= 0) {
        i = d2.getTime() < d1.getTime() ? -1 : 0;
      } else {
        i = d2.getTime() <= d1.getTime() ? 0 : 1;
      }
      return date2.getYear() - date1.getYear() + i;
      break;
    case 'MM':
      var d1 = new Date(date1.getTime());
      var d2 = new Date(date2.getTime());
      d1.setYear(0);
      d1.setMonth(0);
      d2.setYear(0);
      d2.setMonth(0);
      var i;
      if (diff >= 0) {
        i = d2.getTime() < d1.getTime() ? -1 : 0;
      } else {
        i = d2.getTime() <= d1.getTime() ? 0 : 1;
      }
      return ((date2.getYear() * 12) + date2.getMonth()) - ((date1.getYear() * 12) + date1.getMonth()) + i;
      break;
    case 'hh':
      return ~~(diff / (60 * 60 * 1000));
      break;
    case 'mm':
      return ~~(diff / (60 * 1000));
      break;
    case 'ss':
      return ~~(diff / 1000);
      break;
    default:
      return ~~(diff / (24 * 60 * 60 * 1000));
  }
};
e.g.
dateDiff(new Date('2014/1/1'), new Date('2012/1/2')); // 1
dateDiff(new Date('2014/1/1 12:00:00'), new Date('2012/1/2 00:00:00')); // 0 翌日だけど24時間経っていないので0
dateDiff(new Date('2014/1/1'), new Date('2013/1/1'), 'YYYY'); // -1

CoffeeScript

以下CoffeeScriptでも書いてみたけれどあんまりテストはしていない

formatDate
###*
 * 日付をフォーマットする
 * @param  {Date}   date     日付
 * @param  {String} [format] フォーマット
 * @return {String}          フォーマット済み日付
###
formatDate = (date, format = 'YYYY-MM-DD hh:mm:ss.SSS') ->
  format = format.replace /YYYY/g, date.getFullYear()
  format = format.replace /MM/g, ('0' + (date.getMonth() + 1)).slice(-2)
  format = format.replace /DD/g, ('0' + date.getDate()).slice(-2)
  format = format.replace /hh/g, ('0' + date.getHours()).slice(-2)
  format = format.replace /mm/g, ('0' + date.getMinutes()).slice(-2)
  format = format.replace /ss/g, ('0' + date.getSeconds()).slice(-2)
  if format.match /S/g
    milliSeconds = ('00' + date.getMilliseconds()).slice(-3)
    length = format.match(/S/g).length
    format.replace /S/, milliSeconds.substring(i, i + 1) for i in [0...length]
  return format
addDate
###*
 * 日付を加算する
 * @param  {Date}   date       日付
 * @param  {Number} num        加算数
 * @param  {String} [interval] 加算する単位
 * @return {Date}              加算後日付
###
addDate = (date, num, interval) ->
  switch interval
    when 'YYYY'
      date.setYear date.getYear() + num
    when 'MM'
      date.setMonth date.getMonth() + num
    when 'hh'
      date.setHours date.getHours() + num
    when 'mm'
      date.setMinutes date.getMinutes() + num
    when 'ss'
      date.setSeconds date.getSeconds() + num
    else
      date.setDate date.getDate() + num
  return date
dateDiff
###*
 * 日付を加算する
 * @param  {Date}   date       日付
 * @param  {Number} num        加算数
 * @param  {String} [interval] 加算する単位
 * @return {Date}              加算後日付
###
dateDiff = (date1, date2, interval) ->
  diff = date2.getTime() - date1.getTime()
  switch interval
    when 'YYYY'
      d1 = new Date date1.getTime()
      d2 = new Date date2.getTime()
      d1.setYear 0
      d2.setYear 0
      if diff >= 0
        i = d2.getTime() < d1.getTime() ? -1 : 0
      else
        i = d2.getTime() <= d1.getTime() ? 0 : 1
      return date2.getYear() - date1.getYear() + i
    when 'MM'
      d1 = new Date date1.getTime()
      d2 = new Date date2.getTime()
      d1.setYear 0
      d1.setMonth 0
      d2.setYear 0
      d2.setMonth 0
      if diff >= 0
        i = d2.getTime() < d1.getTime() ? -1 : 0
      else
        i = d2.getTime() <= d1.getTime() ? 0 : 1
      return ((date2.getYear() * 12) + date2.getMonth()) - ((date1.getYear() * 12) + date1.getMonth()) + i;
    when 'hh'
      return ~~(diff / (60 * 60 * 1000))
    when 'mm'
      return ~~(diff / (60 * 1000))
    when 'ss'
      return ~~(diff / 1000)
    else
      return ~~(diff / (24 * 60 * 60 * 1000))

蛇足

Moment.jsというライブラリを使う方法も書いた。
http://qiita.com/osakanafish/items/5ef636bbcb2c3ef94953
(2015/1追記)。

268
245
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
268
245