鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

タイムゾーンに頭を悩ませたけれど

筋トレ応援団の筋トレ履歴データをPostgreSQLに格納するのですが、将来的には
グローバルで使われることを考慮してどのように
格納すればいいのか割と真面目に考えたつもり。

DBはタイムゾーン付きのtimestampを使用する

CREATE TABLEでtimestamp with time zoneタイプで定義した。
あとは、insert文でcurrent_timestampを使うだけ。日本時間で保存されることになる。

今月の筋トレ回数を求める検索

クライアントのタイムゾーンで検索してあげればいい。将来的にはAsia/Tokyoを可変にすればいいのではないか。
PostgreSQLタイムゾーンの変換を委譲しちゃう感じです。

var moment = require('moment-timezone');
var today = new moment().tz('Asia/Tokyo');
var firstDay = new moment({year : today.year(), month: today.month(), day: 1}).tz('Asia/Tokyo').format();
var lastDay = new moment({year : today.year(), month: today.month()+ 1, day: 0}).tz('Asia/Tokyo').format();

SQLでfirstDay,lastDayの範囲指定で検索する。lastDayの00:00:00も含まれてしまうけれど!!
まぁいいか。

もっと簡潔に書ける

今月の範囲
var moment = require('moment-timezone');
var firstDay = new moment().startOf('month').tz('Asia/Tokyo').format();
var lastDay = new moment().endOf('month').tz('Asia/Tokyo').format();

今日の範囲
var moment = require('moment-timezone');
var firstDay = new moment().startOf('day').tz('Asia/Tokyo').format();
var lastDay = new moment().endOf('day').tz('Asia/Tokyo').format();

今週の範囲
var moment = require('moment-timezone');
var firstDay = new moment().startOf('week').tz('Asia/Tokyo').format();
var lastDay = new moment().endOf('week').tz('Asia/Tokyo').format();

まじかい、便利すぎじゃろ。