こちらはあら便利カレンダー2018の記事です。
Luxonは時間を扱いやすくするためのJavaScriptライブラリ。
すでに有名なmoment.jsと同じGithubリポジトリで開発されている、ネクストmoment.js的な位置づけのやつです。
特徴
DateTime, Duration, and Interval types. Immutable, chainable, unambiguous API. Parsing and formatting for common and custom formats. Native time zone and Intl support (no locale or tz files).
- 時間に関する日時、量、期間を扱う3つのクラスが内包されていて
- イミュータブルですよ!
- タイムゾーンとかも最初からサポートされてますよ!
といった感じです。
momentでしんどかった部分(イミュータブル & タイムゾーン)が解消された、用途に応じた各クラスがえらい強力になった、などなど
使ってみてとてもよかったのですが、
日本語の記事はまだあんまなさげ、QiitaにもLuxonタグなかったのでまとめ記事かきました。
以下、逆引き形式で使い方を紹介します。
内容はほぼ公式ドキュメントを和訳して逆引きにしただけです。
逆引きLuxon
現在時刻で取得
DateTime.local();
日時指定で取得
DateTime.local(2017, 5, 15, 8, 30);
タイムゾーンをUTCにする
const dateTime = DateTime.local(); const utcDateTime = dateTime.toUTC();
タイムゾーン指定
DateTime.fromObject({zone: 'America/Los_Angeles'}) // ロサンゼルス時間の今 DateTime.local().setZone('America/Los_Angeles') // こっちでも同じ
フォーマットを指定して文字列出力
const dateTime = DateTime.local(); dateTime.toFormat('yyyy/MM/dd');
日時を足す・引く・セットする
var dt = DateTime.local(); dt.plus({hours: 3, minutes: 2}); dt.minus({days: 7}); dt.set({hour: 3});
日時の始まり、終わりを取得
dt.startOf('month'); dt.endOf('hour');
指定量の時間を取得
Duration.fromObject({hours: 2, minutes: 7}); // 2時間7分
違う単位の時間を足す、引く
const year = Duration.fromObject({years: 1}); const weeks = Duration.fromOject({weeks: 100}); const diff = year.minus(weeks);// 日で考えると 365 - 700 になる
指定期間を扱う
now = DateTime.local(); later = DateTime.local(2020, 10, 12); i = Interval.fromDateTimes(now, later); i.length('years'); // 今から2020/10/12まで
指定の期間に含まれているかチェック(期間、日時)
const now = DateTime.local(); const start = DateTime.local(2020,7,24); const olympic = Interval.fromDateTimes(start, start.plus(days: 16)); olympic.contain(now); // 今が2020/7/24-2020/8/9に含まれているか => false
指定の期間に含まれているかチェック(期間、期間)
const now = DateTime.local(); const tomorrow = now.plus({'day': 1}); const twoDays = Interval.fromDateTimes(now, tomorrow); const start = DateTime.local(2020,7,24); const olympic = Interval.fromDateTimes(start, start.plus(days: 16)); olympic.overlaps(twoDays); // 現在-明日までの期間が2020/7/24-2020/8/9との重複があるか => false
ある期間から複数の期間で重複しない期間を取得
const plans = [ Interval.fromDateTimes(~~~~), Interval.fromDateTimes(~~~~), Interval.fromDateTimes(~~~~) ]; const now = DateTime.local(); const thisMonth = Interval.fromDateTimes(now.startOf('month'), now.endOf('month')); const availables = thisMonth.difference(...plans); // 予定A,B,Cがあり今月予定のない期間をすべて取得する、みたいな
2つの期間の積集合を取得
const intervalOne = Interval.fromDateTimes(~~~~); const intervalTwo = Interval.fromDateTimes(~~~~); const intersection = intervalOne.intersection(intervalTwo);
2つの期間の和集合を取得
const intervalOne = Interval.fromDateTimes(~~~~); const intervalTwo = Interval.fromDateTimes(~~~~); const union = intervalOne.union(intervalTwo);
もっと時間の計算に便利な機能がたくさんあるのですが、、
もしリクエストとかあればこの記事を更新するかもです!!
ひとまず力尽きたのでこのへんで。