0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【JS】date-fnsを使って 日本語で「X年Xヶ月」を返す関数(コピペ用)

Last updated at Posted at 2020-06-09

経緯

  • 指定した時間から経過した時間「X年Xヶ月」を日本語で返す関数、ググれば使えるものがすぐ出てくるかと思ったが記事がなかったので書いておく

前提

  • 開発では日付管理ライブラリによくdate-fnsを使用するので今回はそちらを利用する

いまから導入する場合は早速追加

terminal
$ npm install date-fns --save
# or
$ yarn add date-fns

実装

コメント欄で教えて頂いた内容を以下に追記(2020/07/31)

formatDurationを使用する方法

formatDurationにlocale: jaを渡して実装する方法だと比較的シンプルに求められる
(この場合表示形式は「2年 2か月」の様な定型文で返ってくる)

import { formatDuration, intervalToDuration, parseISO } from 'date-fns';
import { ja } from 'date-fns/locale';

export function formatInterval(start: Date, end: Date) {
  const duration = intervalToDuration({ start, end });
  return formatDuration(duration, {
    format: ['years', 'months'],
    locale: ja,
  });
}

formatInterval(
  parseISO('2018-04-10T00:00:00'),
  parseISO('2020-06-10T00:00:00')
); // '2年 2か月'

differenceInYears, differenceInMonthsを使用する方法

「2年 2か月」などの定型文ではなく「2年2ヶ月」など自由な形式で表示したい場合はこちら


import { differenceInYears, differenceInMonths, parseISO } from 'date-fns';

~ ~ ~

// 指定した時間から経過した時間「X年Xヶ月」を返す
const getDifferenceInYM = (targetDate: Date, baseDate: Date) => {
  let date = targetDate;
  const diffYears = differenceInYears(baseDate, date);
  if (diffYears) {
    date = addYears(date, diffYears);
  }
  const diffMonths = differenceInMonths(baseDate, date);

  const year = diffYears ? `${diffYears}年` : '';
  const month = diffMonths ? `${diffMonths}ヶ月` : '';
  return `${year}${month}`;
};

getDifferenceInYM(
  // stringをDate型に変換
  parseISO('2018-04-10 00:00:00'),
  parseISO('2020-06-10 00:00:00')
); // '2年2ヶ月'
0
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?