Day.jsで「○歳○ヶ月」のように年と月を併記する

5040 ワード

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