日付フィールドに生年月日を入力した際に年齢を自動取得するJavaScriptを紹介いたします。
JavaScript
window.addEventListener('DOMContentLoaded', (event) => {
//任意の生年月日フィールドと年齢フィールドのname値を指定
//サンプルでは生年月日=birthday、年齢=ageとしております。
var birthdayYearName = 'birthday:year';
var birthdayMonthName = 'birthday:month';
var birthdayDayName = 'birthday:day';
var ageName = 'age'
var yearInput = document.getElementsByName(birthdayYearName)[0];
var monthInput = document.getElementsByName(birthdayMonthName)[0];
var dayInput = document.getElementsByName(birthdayDayName)[0];
var ageInput = document.getElementsByName(ageName)[0];
yearInput.addEventListener('change', setAge);
monthInput.addEventListener('change', setAge);
dayInput.addEventListener('change', setAge);
function setAge() {
var year = yearInput.value;
var month = monthInput.value;
var day = dayInput.value;
if(!year || !month || !day) {
return;
}
var birthday = new Date(year, month - 1, day);
var today = new Date();
var age = today.getFullYear() - birthday.getFullYear();
var m = today.getMonth() - birthday.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birthday.getDate())) {
age--;
}
ageInput.value = age;
}
});
解説
生年月日フィールドを日付フィールド、フィールド名を「birthday」で作成してください。
年齢フィールドを整数フィールド、フィールド名を「age」で作成してください。
任意のフィールド名にする場合はソースコード内の「birthday」を日付フィールドの識別子(name値)、
「age」を年齢フィールドのフィールド名(name値)に変更してください。
登録フォームや更新フォームを作成した後、JavaScriptタブに貼り付けるだけで作動します。
※フォームブロックの設定にて生年月日欄で[年]/[月]/[日]を設定してください。
その他の設定だと作動したしません。
[年/月/日](一つのinputフィールド)にする場合
window.addEventListener('DOMContentLoaded', (event) => {
// 任意の生年月日フィールドと年齢フィールドのname値を指定
// サンプルでは生年月日=birthday、年齢=ageとしております。
var birthdayInputName = 'birthday';
var ageName = 'age'
var birthdayInput = document.getElementsByName(birthdayInputName)[0];
var ageInput = document.getElementsByName(ageName)[0];
birthdayInput.addEventListener('change', setAge);
function setAge() {
var birthdayString = birthdayInput.value;
if (!birthdayString) {
return;
}
// ハイフンまたはスラッシュで分割
var delimiter = birthdayString.includes('-') ? '-' : '/';
var birthdayParts = birthdayString.split(delimiter);
var year = parseInt(birthdayParts[0], 10);
var month = parseInt(birthdayParts[1], 10);
var day = parseInt(birthdayParts[2], 10);
var birthday = new Date(year, month - 1, day);
var today = new Date();
var age = today.getFullYear() - birthday.getFullYear();
var m = today.getMonth() - birthday.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birthday.getDate())) {
age--;
}
ageInput.value = age;
}
});
DB側のトリガ設定で年齢を記録する方法
JavaScriptではフォーム入力時に改ざんされてしまう恐れがありますので、
DB側でもトリガで年齢計算をすることをおすすめいたします。
年齢を格納するフィールドを整数で作成した上で、トリガを作成する必要があります。
▼【更新トリガ】トリガ:年齢計算
| ▼基本設定 | |
|---|---|
| トリガ名 | 年齢計算 |
| ▼処理(1つ目) | |
| 発動条件 | 指定する |
| 関数条件 | MONTH(NOW()) < MONTH(@DB名.生年月日フィールド名) OR MONTH(NOW()) = MONTH(@DB名.生年月日フィールド名) AND DAY(NOW()) < DAY(@DB名.生年月日フィールド名) |
| 処理名 | 誕生日をまだ迎えていない場合1減算 |
| 処理タイプ | 更新 |
| 処理マッピング | アクション先DBフィールド:年齢フィールド = 格納値:YEAR(NOW()) - YEAR(@DB名.生年月日フィールド名) - 1 |
| エラー処理 | 全てエラー終了 |
| ▼処理(2つ目) | |
| 発動条件 | 指定しない |
| 処理名 | 年齢の計算 |
| 処理タイプ | 更新 |
| 処理マッピング | アクション先DBフィールド:年齢フィールド = 格納値:YEAR(NOW()) - YEAR(@DB名.生年月日フィールド名) |
| エラー処理 | 全てエラー終了 |
現在の年-誕生年で年齢を割り出した後に-1をします。
誕生日を迎えられていらっしゃる場合は2つ目の処理にてそのまま現在の年-誕生年と割り出し記録されます。
トリガ内の処理は一つしか行われない為、表の順の通りに必ず設定してください。
