🐱
Day.jsで「○歳○ヶ月」のように年と月を併記する
Day.jsには本日との差分をフォーマットして返してくれるtoNow()というメソッドがあります。
以下のように差分を出したい日をYYYY-MM-DD
の形で渡すことでフォーマットされた文字列が返ってきます。
//birthdayは"2020-09-21"
export const fromBirthdayToAge = (birthday: string): string => {
return dayjs(birthday).toNow(true); //2歳
};
注: 単位を「歳」に変えるためにrelativeTimeオブジェクトをオーバーライドしてますが、今回は説明を省略します。
しかし、これでは1歳6ヶ月の場合も「2歳」と表示されて、単位が大きすぎるように感じます。
「○歳○ヶ月」の形で表示したい場合はどうしたら良いのでしょうか?
以下の形で実現できました。
export const fromBirthdayToAge = (birthday: string): string => {
//年単位で本日と誕生日の差を出す
const yearsDiff = dayjs().diff(dayjs(birthday), "year", true);
//少数切り捨て
const years = Math.floor(yearsDiff);
//年の少数部分を月に換算
const months = Math.floor((yearsDiff - years) * 12);
return `${years}歳${months}ヶ月`;
};
1歳未満の場合も「0歳」表記をしていますが、yearsが0の場合は${months}ヶ月
のみを返せば「4ヶ月」のような表示も可能です。
参考:https://stackoverflow.com/questions/66639760/dayjs-diff-between-two-date-in-day-and-hours
Discussion