Last Update: Oct.11,2021

JavaScript Sample

動作確認: ○Firefox92(Win7) ○Chrome94(Win7)

■ 数値化された日付を使った各種演算

生年月日を入力:

対象の年月日を入力:

対象日:2025/05/25(日)
年齢:満18歳
学年:
数え年:19歳
前の稼働日:2025/05/23(金)
次の稼働日:2025/05/26(月)

■ ソース

/*
 *  次の稼働日を取得
 *
 *    a: 基準となる日付
 *    o: is_workday に渡す休みの配列
 *
 */
var get_next_workday = function(a, o) {
  return business_days_later(a, 1, o);
};

/*
 *  直前の稼働日を取得
 *
 *    a: 基準となる日付
 *    o: is_workday に渡す休みの配列
 *
 */
var get_last_workday = function(a, o) {
  return business_days_ago(a, 1, o);
};

/*
 *  学年を取得
 *
 *    a: 誕生日
 *    b: 学年を取得する日(省略時は現在)
 *
 */
var get_gakunen = function(a, b) {
  var _ = [
    '未就学', '未就学', '未就学',
    '未就学(年少)', '未就学(年中)', '未就学(年長)',
    '小1', '小2', '小3', '小4', '小5', '小6',
    '中1', '中2', '中3',
    '高1', '高2', '高3'
  ];
  var g = get_school_age(a, b);
  return g < 18 ? _[g] : '';
};

jQuery(function($) {

  var jogai = ['日', '土', '祝', '年末年始'];

  if ($('#D2').val() == '') {
    $('#D2').val(date8_to_string(date8()));
  }

  $('#D1,#D2').on('change', function() {
    var bday = string_to_date8($('#D1').val());
    var now = string_to_date8($('#D2').val());
    var wd1 = get_next_workday(now, jogai);
    var wd2 = get_last_workday(now, jogai);
    $('#p0').text(`対象日:${date8_to_string(now, '/')}(${get_day_of_week(now)})`);
    $('#p1').text(`年齢:満${get_age(bday, now)}歳`);
    $('#p2').text(`学年:${get_gakunen(bday, now)}`);
    $('#p3').text(`数え年:${get_kazoedoshi(bday, now)}歳`);
    $('#p4').text(`前の稼働日:${date8_to_string(wd2, '/')}(${get_day_of_week(wd2)})`);
    $('#p5').text(`次の稼働日:${date8_to_string(wd1, '/')}(${get_day_of_week(wd1)})`);
  }).trigger('change');

});
/*
 *  date8.js 0.05
 *
 *  Date: 2021.10.14
 *
 *  Copyright (c) 2021 AOK (aokura.com)
 *
 */

if (!gettype) {
  var gettype = function(v) {
    var s = Object.prototype.toString.call(v);
    return s.replace(/^\[object (\w+)\]$/, "$1");
  };
}

/*
 *  日付を数値に変換(yyyymmdd)
 *
 */
var date8 = function(y, m, d) {
  var dt;
  if (arguments.length == 0) {
    dt = new Date();
  } else if (gettype(y) === 'Array') {
    dt = new Date(y[0], y[1] - 1, y[2]);
  } else if (gettype(y) === 'Date') {
    dt = y;
  } else if (arguments.length == 1) {
    dt = new Date(y, 0, 1);
  } else if (arguments.length == 2) {
    dt = new Date(y, m - 1, 1);
  } else {
    dt = new Date(y, m - 1, d);
  }
  return dt ? date_to_date8(dt) : 0;
};

/*
 *  Date を日付を表す数値に変換
 *
 */
var date_to_date8 = function(dt) {
  var y = dt.getFullYear();
  var m = dt.getMonth() + 1;
  var d = dt.getDate();
  return y * 10000 + m * 100 + d * 1;
};

/*
 *  日付を表す数値を Date に変換
 *
 */
var date8_to_date = function(n8) {
  var a = date8_to_array(n8);
  return new Date(a[0], a[1] - 1, a[2]);
};

/*
 *  日付を表す数値を配列に変換([y,m,d])
 *
 */
var date8_to_array = function(n8) {
  var y = Math.floor(n8 / 10000);
  var m = Math.floor(n8 / 100) % 100;
  var d = n8 % 100;
  return [y, m, d];
};

/*
 *  日付を表す数値の加算
 *  (a: [y,m,d])
 *
 */
var date8_add = function(n8, a) {
  var b = date8_to_array(n8);
  b[0] += a[0];
  b[1] += a[1];
  if (b[2] > 28) {
    var e = new Date(b[0], b[1], 0).getDate();
    if (b[2] > e) b[2] = e;
  }
  b[2] += a[2];
  return date8(b);
};

/*
 *  数値を日付文字列に変換
 *
 */
var date8_to_string = function(n8, sep) {
  var r = date8_to_array(n8);
  r[0] = r[0].toString().padStart(4, '0');
  r[1] = r[1].toString().padStart(2, '0');
  r[2] = r[2].toString().padStart(2, '0');
  return r.join(!sep ? '-' : sep);
};

/*
 *  日付文字列を数値に変換
 *
 */
var string_to_date8 = function(s, sep) {
  return date8(s.split(!sep ? '-' : sep));
};

/*
 *  Date を配列に変換
 *
 */
var date_to_array = function(dt) {
  if (!dt) dt = new Date();
  var y = dt.getFullYear();
  var m = dt.getMonth() + 1;
  var d = dt.getDate();
  return [y, m, d];
};

/*
 *  Utility functions
 *
 */

/*
 *  日付を表す数値から曜日を取得
 *
 */
var get_day_of_week = function(n8) {
  if (gettype(n8) !== 'Date') {
    n8 = date8_to_date(n8);
  }
  return '日月火水木金土'.charAt(n8.getDay());
};

/*
 *  年齢計算
 *
 *    a: 誕生日
 *    b: 年齢を取得する日(省略時は現在)
 *
 */
var get_age = function(a, b) {
  if (!b) b = date8();
  if (gettype(a) === 'Date') a = date8(a);
  if (gettype(b) === 'Date') b = date8(b);
  return Math.floor((b - a) / 10000);
};

/*
 *  学齢計算
 *
 *    a: 誕生日
 *    b: 学齢を取得する日(省略時は現在)
 *
 */
var get_school_age = function(a, b) {
  var r = date8_to_array(b);
  if (r[1] < 4) r[0]--;
  return get_age(a, date8(r[0], 4, 1));
};

/*
 *  数え年計算
 *
 *    a: 誕生日
 *    b: 年齢を取得する日(省略時は現在)
 *
 */
var get_kazoedoshi = function(a, b) {
  var r = date8_to_array(a);
  return get_age(date8(r[0], 1, 1), b) + 1;
};

/*
 *  稼動日かどうかの判定
 *
 *    a: 判定する日付
 *    o: 休みの配列
 *       '日'~'土': 日~土曜(毎週)
 *             '祝': 祝日
 *       '年末年始': 年末年始休み
 *
 */
var is_workday = function(a, o) {
  var w = get_day_of_week(a);
  if (o.indexOf(w) != -1) return false;
  var b = date8_to_array(a);
  if (typeof MonthHolidays === 'function' &&
      o.indexOf('祝') != -1) {
    var mhd = new MonthHolidays(b[0], b[1]);
    if (mhd.check(b[2]) != '') return false;
  }
  if (o.indexOf('年末年始') != -1) {
    var b1 = date8(b[0], 1, 4);
    var b2 = date8(b[0], 12, 28);
    if (a < b1 || a > b2) return false;
  }
  return true;
};

/*
 *  (n)営業日前を取得
 *
 *    a: 基準となる日付
 *    n: 日数
 *    o: is_workday に渡す休みの配列
 *
 */
var business_days_ago = function(a, n, o) {
  while (n > 0) {
    a = date8_add(a, [0, 0, -1]);
    if (is_workday(a, o)) n--;
  }
  return a;
};

/*
 *  (n)営業日後を取得
 *
 *    a: 基準となる日付
 *    n: 日数
 *    o: is_workday に渡す休みの配列
 *
 */
var business_days_later = function(a, n, o) {
  while (n > 0) {
    a = date8_add(a, [0, 0, 1]);
    if (is_workday(a, o)) n--;
  }
  return a;
};

/*
 *  (n)日前の稼働日を取得
 *
 *    a: 基準となる日付
 *    n: 日数
 *    o: is_workday に渡す休みの配列
 *
 */
var n_days_ago = function(a, n, o) {
  a = date8_add(a, [0, 0, 1 - n]);
  return business_days_ago(a, 1, o);
};

/*
 *  (n)日後の稼働日を取得
 *
 *    a: 基準となる日付
 *    n: 日数
 *    o: is_workday に渡す休みの配列
 *
 */
var n_days_later = function(a, n, o) {
  a = date8_add(a, [0, 0, n - 1]);
  return business_days_later(a, 1, o);
};