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

**URL:** <https://community.cybozu.dev/t/topic/575>\
**Category:** kintone 開発相談\
**Created:** [2017 年 10 月 11 日午前 7:14 UTC](https://community.cybozu.dev/t/topic/575 "2017-10-11T07:14:21Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![Legacy\_Account1724](https://avatars.discourse-cdn.com/v4/letter/l/e95f7d/32.png) [@Legacy\_Account1724](https://community.cybozu.dev/u/Legacy_Account1724)\
**Post date:** [2017 年 10 月 11 日午前 7:14 UTC](https://community.cybozu.dev/t/topic/575/1 "2017-10-11T07:14:21Z")

</div>

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

①「[フィールドに値を計算セットしたが画面上に反映されない件](https://community.cybozu.dev/hc/ja/community/posts/211020666-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AB%E5%80%A4%E3%82%92%E8%A8%88%E7%AE%97%E3%82%BB%E3%83%83%E3%83%88%E3%81%97%E3%81%9F%E3%81%8C%E7%94%BB%E9%9D%A2%E4%B8%8A%E3%81%AB%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E4%BB%B6)」を参考に

しておりますが、誕生日が2016/10/25の場合、本日2017/10/12で計算したら、年齢が1年０ヶ月になりますが、誕生日前だから、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;  
}  
})();

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1517](https://avatars.discourse-cdn.com/v4/letter/l/4bbf92/32.png) [@Legacy\_Account1517](https://community.cybozu.dev/u/Legacy_Account1517)\
**Post date:** [2017 年 10 月 12 日午前 5:33 UTC](https://community.cybozu.dev/t/topic/575/2 "2017-10-12T05:33:52Z")

</div>

goro さん

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

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

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

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

[経過年数を表示する](https://community.cybozu.dev/hc/ja/articles/202640900-%E7%B5%8C%E9%81%8E%E5%B9%B4%E6%95%B0%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1724](https://avatars.discourse-cdn.com/v4/letter/l/e95f7d/32.png) [@Legacy\_Account1724](https://community.cybozu.dev/u/Legacy_Account1724)\
**Post date:** [2017 年 10 月 12 日午前 6:51 UTC](https://community.cybozu.dev/t/topic/575/3 "2017-10-12T06:51:00Z")

</div>

**[rex0220](https://community.cybozu.dev/hc/ja/profiles/435994154-rex0220)&nbsp;様**

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

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

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

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

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

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1517](https://avatars.discourse-cdn.com/v4/letter/l/4bbf92/32.png) [@Legacy\_Account1517](https://community.cybozu.dev/u/Legacy_Account1517)\
**Post date:** [2017 年 10 月 12 日午前 7:52 UTC](https://community.cybozu.dev/t/topic/575/4 "2017-10-12T07:52:05Z")

</div>

サンプルコードです。

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

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

&nbsp;

```
(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 '';
}
})();

```

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1724](https://avatars.discourse-cdn.com/v4/letter/l/e95f7d/32.png) [@Legacy\_Account1724](https://community.cybozu.dev/u/Legacy_Account1724)\
**Post date:** [2017 年 10 月 12 日午前 8:12 UTC](https://community.cybozu.dev/t/topic/575/5 "2017-10-12T08:12:42Z")

</div>

**[rex0220](https://community.cybozu.dev/hc/ja/profiles/435994154-rex0220)&nbsp;様**

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

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

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

---

<div class="post-metadata">

**Author:** ![Legacy\_Account801](https://avatars.discourse-cdn.com/v4/letter/l/c2a13f/32.png) [@Legacy\_Account801](https://community.cybozu.dev/u/Legacy_Account801)\
**Post date:** [2019 年 1 月 15 日午前 1:39 UTC](https://community.cybozu.dev/t/topic/575/6 "2019-01-15T01:39:40Z")

</div>

[rex0220](https://community.cybozu.dev/hc/ja/profiles/435994154-rex0220)&nbsp;様

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

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

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

---

<div class="post-metadata">

**Author:** ![Legacy\_Account801](https://avatars.discourse-cdn.com/v4/letter/l/c2a13f/32.png) [@Legacy\_Account801](https://community.cybozu.dev/u/Legacy_Account801)\
**Post date:** [2019 年 1 月 15 日午前 2:27 UTC](https://community.cybozu.dev/t/topic/575/7 "2019-01-15T02:27:14Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1517](https://avatars.discourse-cdn.com/v4/letter/l/4bbf92/32.png) [@Legacy\_Account1517](https://community.cybozu.dev/u/Legacy_Account1517)\
**Post date:** [2019 年 1 月 15 日午前 2:40 UTC](https://community.cybozu.dev/t/topic/575/8 "2019-01-15T02:40:31Z")

</div>

Joan さん

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

&nbsp;

---

<div class="post-metadata">

**Author:** ![Legacy\_Account801](https://avatars.discourse-cdn.com/v4/letter/l/c2a13f/32.png) [@Legacy\_Account801](https://community.cybozu.dev/u/Legacy_Account801)\
**Post date:** [2019 年 1 月 15 日午前 4:02 UTC](https://community.cybozu.dev/t/topic/575/9 "2019-01-15T04:02:30Z")

</div>

[rex0220](https://community.cybozu.dev/hc/ja/profiles/435994154-rex0220)&nbsp;様

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

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

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

(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 ‘’;  
}  
})();

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1517](https://avatars.discourse-cdn.com/v4/letter/l/4bbf92/32.png) [@Legacy\_Account1517](https://community.cybozu.dev/u/Legacy_Account1517)\
**Post date:** [2019 年 1 月 15 日午前 5:24 UTC](https://community.cybozu.dev/t/topic/575/10 "2019-01-15T05:24:54Z")

</div>

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

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

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

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

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

[はじめようJavaScript第1回 JavaScriptとは](https://community.cybozu.dev/hc/ja/articles/115002336526)

[第0回 kintone カスタマイズをはじめる前に知っておきたい6つのこと](https://community.cybozu.dev/hc/ja/articles/211029283)

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

&nbsp;

---

<div class="post-metadata">

**Author:** ![Legacy\_Account801](https://avatars.discourse-cdn.com/v4/letter/l/c2a13f/32.png) [@Legacy\_Account801](https://community.cybozu.dev/u/Legacy_Account801)\
**Post date:** [2019 年 1 月 15 日午前 6:07 UTC](https://community.cybozu.dev/t/topic/575/11 "2019-01-15T06:07:51Z")

</div>

[rex0220](https://community.cybozu.dev/hc/ja/profiles/435994154-rex0220)&nbsp;様

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

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

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

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

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

---

<div class="post-metadata">

**Author:** ![Legacy\_Account801](https://avatars.discourse-cdn.com/v4/letter/l/c2a13f/32.png) [@Legacy\_Account801](https://community.cybozu.dev/u/Legacy_Account801)\
**Post date:** [2019 年 1 月 18 日午前 6:01 UTC](https://community.cybozu.dev/t/topic/575/12 "2019-01-18T06:01:43Z")

</div>

[rex0220](https://community.cybozu.dev/hc/ja/profiles/435994154-rex0220)&nbsp;様

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

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

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 ‘’;  
}

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)\
**Post date:** [2025 年 5 月 29 日午前 2:56 UTC](https://community.cybozu.dev/t/topic/575/13 "2025-05-29T02:56:17Z")

</div>

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。
