年齢を自動計算で求めたい

このように、「年齢」を自動計算で求めたいです。

①「フィールドに値を計算セットしたが画面上に反映されない件」を参考に

しておりますが、誕生日が2016/10/25の場合、本日2017/10/12で計算したら、年齢が1年0ヶ月になりますが、誕生日前だから、0年11ヶ月になるようにしたいですが、どうすればよろしいでしょうか?アドバイスいただきたいです。

(function () {
“use strict”;
// 基準日までの年月計算(経過年月数の計算)
function nen_set(dtDate, dtRefDate, typeDate) {
var dtToday = new Date(dtRefDate); //基準日
var dtFrom = new Date(dtDate);

switch (typeDate) {
case ‘yy’:
var intDays = (dtToday - Date.parse(dtDate)) / 1000 / 60 / 60 / 24;
return Math.floor(intDays / 365);
case ‘yymm’:
var intYear = dtToday.getFullYear() - dtFrom.getFullYear();
var intMonth = dtToday.getMonth() - dtFrom.getMonth();
if (intMonth < 0) {
intYear–;
intMonth += 12;
}
return intYear + “年” + intMonth + “ケ月”;
default:
return null;
}
}

//前ゼロの文字列を作成する関数
function zeroformat(v, n) {
var v1 = String(v).length;
if (n > v1) {
return (new Array((n - v1) + 1).join(0)) + v;
} else {
return v;
}
}

var flg = true;
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
kintone.events.on([‘app.record.edit.change.生年月日’,
‘app.record.create.change.生年月日’,
‘app.record.index.edit.change.生年月日’,
‘app.record.edit.change.基準日’,
‘app.record.create.change.基準日’,
‘app.record.index.edit.change.基準日’,
‘app.record.create.show’,
‘app.record.edit.show’], function (event) {
var record = event.record;

if (event.type === ‘app.record.create.show’ || event.type === ‘app.record.edit.show’) {
// フィールド制御
record[‘年齢’][‘disabled’] = true;

// 基準日に今日をセット
var dt = new Date();
var today = dt.getFullYear() + “-” + zeroformat((dt.getMonth() + 1), 2) + “-” + zeroformat(dt.getDate(), 2);
if (record[‘基準日’].value !== today) {
record[‘基準日’].value = today;
flg = false;
return tekitou(event);
}
} else if (flg) {
return tekitou(event);
} else {
flg = true;
}

return event;
});

function tekitou(event) {
var record = event.record;
var wkDate = record[‘生年月日’].value;
var wkReferenceDate = record[‘基準日’].value;

if ((wkDate === undefined) || (wkReferenceDate === undefined)) {
record[‘年齢’].value = “”;
return event;
}

var wkRetVal = nen_set(wkDate, wkReferenceDate, ‘yymm’); //「○年○ケ月」を求める

record[‘年齢’].value = wkRetVal;
return event;
}
})();

goro さん

なにか特殊なロジックで、年数計算のみに対応しているように思われます。

年月日の計算だとうるう年も考慮しなければなりませんので、使えないと思います。

一般的な Moment.js を使って、計算されてはいかがでしょうか?

下記が参考になると思います。

経過年数を表示する

rex0220 様

いつもお世話になっております。

アドバイスいただき、誠にありがとうございます。

参考にするサンプルもみてみましたが、年齢はボタンを押すときにしか出て来ないので、どうすればいいかわからなくて。。

今のサンプルを簡単に年齢フィールドに反映することは可能でしょうか?再びアドバイスいただけると幸いです。

よろしくお願い致します。

サンプルコードです。

基準の仕様がよくわかりませんでしたので、編集画面表示時に当日日付を入れました。

あと、Moment.js を指定してください。

 

(function() {
"use strict";

//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
kintone.events.on(['app.record.edit.change.生年月日',
'app.record.create.change.生年月日',
'app.record.index.edit.change.生年月日',
'app.record.edit.change.基準日',
'app.record.create.change.基準日',
'app.record.index.edit.change.基準日',
'app.record.create.show',
'app.record.edit.show',
'app.record.index.edit.show'
], function(event) {
var record = event.record;

moment.locale('ja');
if (['app.record.create.show', 'app.record.edit.show', 'app.record.index.edit.show'].indexOf(event.type) >= 0) {
// フィールド制御
record['年齢']['disabled'] = true;
record['基準日'].value = moment().format('YYYY-MM-DD');
}

record['年齢'].value = ageCal(record['生年月日'].value, record['基準日'].value);
return event;
});

// 年齢計算
function ageCal(wkDate, wkReferenceDate) {
if (wkDate && wkReferenceDate) {
var mDate = moment(wkDate);
var mReferenceDate = moment(wkReferenceDate);
if (!mReferenceDate.isBefore(moment(mDate), 'day')) {
var years = mReferenceDate.diff(moment(mDate), 'years');
var months = mReferenceDate.diff(moment(mDate), 'months') % 12;
return years + "年 " + months + "ヶ月";
}
}
return '';
}
})();
「いいね!」 1

rex0220 様

いつもお世話になっております。

すごいです。とても感動致しました。

本当にありがとうございます。

rex0220 様

こんにちは、こちらのコードを参考し、年月の計算したいのですが、

でも基準日は今ではなく、あらかじめ指定した日付です、でもそこを変えたらうまく作動していなかった、

すみませんが、アドバイスいただきたいです。

補足ですが、テーブルを使っていて、もしかしたらそのせいかもしてない。

Joan さん

そうですね、テーブルの場合はテーブル行単位に処理が必要です。

 

rex0220 様

そうですな、今はこんな風に書いています、

上にはテーブル式と思うですが、どう使うのがうまくできなくて。

すみませんが、アドバイスをいただきたい、ありがとうございます。

(function () {
“use strict”;

kintone.events.on([‘app.record.edit.change.學歷期間_起_’,
‘app.record.create.change.學歷期間_起_’,
‘app.record.index.edit.change.學歷期間_起_’,
‘app.record.edit.change.學歷期間_迄_’,
‘app.record.create.change.學歷期間_迄_’,
‘app.record.index.edit.change.學歷期間_迄_’,
‘app.record.create.show’,
‘app.record.edit.show’,
‘app.record.index.edit.show’
], function(event) {

var record = event.record;

moment.locale(‘ja’);

if ([‘app.record.create.show’, ‘app.record.edit.show’, ‘app.record.index.edit.show’].indexOf(event.type) >= 0) {

// フィールド制御

record[‘學歷年數_年月’][‘disabled’] = true;
record[‘學歷期間_迄_’].value = record[‘學歷期間_迄_’].value;

}

record[‘學歷年數_年月’].value = shcoolCal(record[‘學歷期間_起_’].value, record[‘學歷期間_迄_’].value);

return event;

});

// 計算

function shcoolCal(wkDate, wkReferenceDate) {

if (wkDate && wkReferenceDate) {
var mDate = moment(wkDate);
var mReferenceDate = moment(wkReferenceDate);
if (!mReferenceDate.isBefore(moment(mDate), ‘day’)) {
var years = mReferenceDate.diff(moment(mDate), ‘years’);
var months = mReferenceDate.diff(moment(mDate), ‘months’) % 12;
return years + "年 " + months + “個月”;
}
}

return ‘’;
}
})();

いろいろ切り貼りしたためだと思いますが、使用していない変数や関数があります。

まず、不要なものを削除しましょう。

テーブルについては、ループ処理が必要です。

はじめに JavaScript の配列やループ処理について使い方を学びましょう。

チュートリアルが用意されていますので、順番にやってみてください。

はじめようJavaScript第1回 JavaScriptとは

第0回 kintone カスタマイズをはじめる前に知っておきたい6つのこと

基本を知らないと、応用が利かないのでトラブルに対応出来なくなります。

 

rex0220 様

回答ありがとうございます。

そうですね、雑な見せ方してすみません。

チュートリアルはいつも拝見していて、テーブルの関するのあるが、テーブル内の計算がやはりうまく作動してなかったので、

すみません、こんなに雑な質問し、

回答いただき、ありがとうございます。

rex0220 様

テーブルについては、結局ループ処理は必要ないです。

下記のように解決しました。ただフィールド制御はかけられなかったです。

var table_row = event.changes.row;

moment.locale(‘ja’);

if ([‘app.record.create.show’, ‘app.record.edit.show’, ‘app.record.index.edit.show’].indexOf(event.type) >= 0) {

// フィールド制御

table_row.value[‘學歷年數_T’].disabled = true;
table_row.value[‘學歷期間_迄_’].value = table_row.value[‘學歷期間_迄_’].value;

}

table_row.value[‘學歷年數_T’].value = shcoolCal(table_row.value[‘學歷期間_起_’].value, table_row.value[‘學歷期間_迄_’].value);

return event;

});

// 計算

function shcoolCal(wkDate, wkReferenceDate) {

if (wkDate && wkReferenceDate) {
var mDate = moment(wkDate);
var mReferenceDate = moment(wkReferenceDate);
if (!mReferenceDate.isBefore(moment(mDate), ‘day’)) {
var years = mReferenceDate.diff(moment(mDate), ‘years’);
var months = mReferenceDate.diff(moment(mDate), ‘months’) % 12;
return years + "年 " + months + “個月”;
}
}

return ‘’;
}