こちらはあら便利カレンダー2018の記事です。
jsfiddleでLuxon playground作りました!
http://jsfiddle.net/nobu222/p49m62k7/
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);
DateTimeを比較
const oneDay = DateTime.local();
const someDay = DateTime.local(2018, 8, 14, 8, 30);
if (oneDay > someDay) console.log('oneDay after someDay');
// log...oneDay after someDay
タイムゾーンを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);
もっと時間の計算に便利な機能がたくさんあるのですが、、
もしリクエストとかあればこの記事を更新するかもです!!
ひとまず力尽きたのでこのへんで。