【JS】【TS】date-fns ~ 入門編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/01/29/231952

の続き。

Date に関するライブラリの内に気になった date-fns について
実際に使ってみた。(若干のハマりポイントあり)

目次

【1】date-fns
【2】公式サイト
【3】使用上の注意
【4】環境設定
【5】サンプル
 例1:Hello world
 例2:先月の月初・月末日

【1】date-fns

* JavaScript/TypeScriptで Date を扱う際の便利ツール
 => 特徴としたら、標準の Date() を元に
  ユーティリティ関数を用意してくれる感じ

【2】公式サイト

https://date-fns.org/

【3】使用上の注意

1)バージョン(v1.X系 と v2.X系)の違い

* はじめ、Github の例のように
「yyyy-MM-dd」って指定してたら
「yyyy-01-Sa」って表示された。
 =>大文字で「YYYY-MM-DD」で正しく動いた。

https://github.com/date-fns/date-fns

うまく動かなかった例

const today = format(new Date(), 'yyyy-MM-dd');
console.log(today); // yyyy-01-Sa

原因

* どうもVersion(v1.X系 と v2.X系)によって、YYYY-MM-DDの指定の仕方が違う
 => 導入する際は、v2.X系を採用した方が良さそう
 => 仮に「v1.X系」を導入した場合、
  バージョン上げたらバグったってなりそうなので。

v1.30.1
https://date-fns.org/v1.30.1/docs/Getting-Started

dateFns.format(new Date(2014, 1, 11), 'MM/DD/YYYY') //<=★注目★
//=> '02/11/2014'

v2.16.1
https://date-fns.org/v2.16.1/docs/Getting-Started

format(new Date(2014, 1, 11), 'MM/dd/yyyy') //<=★変わっとる...★
//=> '02/11/2014'

【4】環境設定

npm install date-fns --save

 => date-fns v1.30.1 がインストールされた

Version2.XX系を入れたい場合

# アンインストール
npm uninstall date-fns --save

# バージョンを指定してインストールする
npm install date-fns@2.16.1 --save

【5】サンプル

例1:Hello world

sample.ts (v1.30.1 の場合)

import { format } from 'date-fns';

const today = format(new Date(), 'YYYY/MM/DD');
console.log(today); // 2021/01/30

const now = format(new Date(), 'YYYY-MM-DD HH:mm:ss');
console.log(now); // 2021-01-30 23:33:47

sample.ts (v2.16.1 の場合)

import { format } from 'date-fns';

const today = format(new Date(), 'yyyy/MM/dd');
console.log(today); // 2021/01/30

const now = format(new Date(), 'yyyy-MM-dd HH:mm:ss');
console.log(now);

補足:実行コマンド

# コンパイル
tsc sample.ts

# 実行
node sample.js

例2:先月の月初・月末日

https://qiita.com/watsuyo_2/items/0dec893c37129fe832d4

に記載されている。

sample.ts (v2.16.1 の場合)

import { startOfMonth, subMonths, subDays, format } from 'date-fns';

// 今日の日付を取得
const today = new Date;
// 2021-01-31T12:47:11.911Z
console.log(today);

// 今月1日を取得
const startDay = startOfMonth(today);
// 2020-12-31T15:00:00.000Z
console.log(startDay);

// subMonthsで月に対して+1month
const lastMonthStartDay = subMonths(startDay, +1);
// subDaysで日に対して+1day
const lastMonthEndDay = subDays(startDay, +1);

// 先月の月初 (2020-11-30T15:00:00.000Z) <= UTC?
console.log(lastMonthStartDay);
// 2020-12-01 00:00:00 <= Formatで出せば意図したとおりに表示
console.log(format(lastMonthStartDay, 'yyyy-MM-dd HH:mm:ss'));

// 先月の月末 (2020-12-30T15:00:00.000Z) <= UTC?
console.log(lastMonthEndDay);
// 2020-12-31 00:00:00 <= Formatで出せば意図したとおりに表示
console.log(format(lastMonthEndDay, 'yyyy-MM-dd HH:mm:ss'));

参考文献

https://qiita.com/suin/items/296740d22624b530f93a
https://co.bsnws.net/article/195

関連記事

TypeScript での 日付 / 日時 の扱い
https://dk521123.hatenablog.com/entry/2021/01/29/231952
Day.js ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2021/01/31/213123
TypeScript ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/12/21/180904