date-fns-timezone
node.jsで日付処理するにはdate-fnsを利用すると便利に実装できます。
参考: https://www.webprofessional.jp/date-fns-javascript-date-library/
ですがこのライブラリのみだとタイムゾーンの計算がうまくできず何か使えるものがないか調べてみたところ、date-fns-timezoneというライブラリが良さげだったので使ってみました。
今回やりたいこと
日付がUTCで格納されているデータソース(DynamoDB)に対して日本時間の日付範囲でクエリをかけたい
指定日に含まれるデータを取得するDynamoDBクエリを組み立てる
const targetDate = new Date(); // '2019-03-06T11:36:25.533Z' (ここはUTC)
// 日本時間の0時
const d1 = startOfDay(targetDate); // '2019-03-05T15:00:00.000Z'
// 日本時間の翌日0時
const d2 = endOfDay(targetDate); // '2019-03-06T15:00:00.000Z'
const param = {
TableName : 'Comment',
KeyConditionExpression: "#key= :key AND #date >= :d1 AND #date < :d2",
ExpressionAttributeNames:{
"#key": "key",
"#date": "date"
},
ExpressionAttributeValues: {
":key": key,
":d1": d1,
":d2": d2,
}
};
使ってみる
date-fns-timezoneのインストール
npmからインストールできます。
$ npm install date-fns-timezone
依存ライブラリとして date-fns もインストールされるのでこちらも利用します。
今回利用したのはライブラリバージョンは以下です。
- date-fns-timezone : 0.1.4
- date-fns : 1.30.1
日本時間での0時を計算する
// import
const { startOfDay, addDays } = require('date-fns');
const { convertToTimeZone } = require('date-fns-timezone');
// タイムゾーン定義
const timeZone = "Asia/Tokyo";
// 現在時刻(UTC)を取得
const targetDate = new Date();
// TimeZone付きDateに変換
const zonedTargetDate = convertToTimeZone(targetDate, { timeZone: timeZone });
// date-fnsでstartOfDayを計算
const startDate = startOfDay(zonedTargetDate);
const endDate = addDays(startDate, 1);
// 文字列化
const d1 = startDate.toISOString(); // => '2019-03-05T15:00:00.000Z'
const d2 = endDate.toISOString(); // => '2019-03-06T15:00:00.000Z'
convertToTimeZoneを利用するとTimeZone情報を持ったDateに拡張されるため、date-fnsのstartOfDay()などもそのまま使えるのが便利ですね。
指定のフォーマットでフォーマットするにはdate-fns-timezoneのformatToTimeZoneも使えます。
詳細ドキュメントはこちら。
https://www.npmjs.com/package/date-fns-timezone