今朝Hubot用のScriptを書いてて
- MongoDBにイベント情報を格納してあるような状況
- HubotからそのMongoDBにアクセスしてイベント開始日が今日にマッチするものを抜き出したい
という状況で地味に今日のはじまりの値を手軽に取得する方法がわからずちょっとハマったので簡単にまとめます。
JavaScriptで日付処理といえばMoment.js
日付処理を便利にするライブラリではMoment.jsが有名かと思い、自分も結構多用してるのでこれをベースに今日のはじまりの値を取得する方法を探すことにしました
タイムゾーンを日本のものにするために
moment.locale('ja')
としてから作業進めてます。
今日のはじまりをどのように得るか?
最初に思いついたのは
- moment()で現在日付時刻を取得
- 上記で得られた値に対して、hour()、minute()、seconds()でそれぞれ0を与える
current = moment() # Wed Nov 05 2014 08:02:53 GMT+0900 (JST)
beginningOfDay = current.hour(0).minute(0).seconds(0) # Wed Nov 05 2014 00:00:00 GMT+0900 (JST)
これでも意図した値は得られたのですが、このアプローチで、今日の終わりを得るには
- moment()で現在日付時刻を取得
- 上記で得られた値に対して、add(1, 'days')として明日の日付を得つつhour()、minute()、seconds()でそれぞれ0を与える
- 2.で得た値に対して、add(-1, 'seconds')という感じでマイナス1秒する
という感じで、どう考えてもスマートじゃないし、きっと違う方法があるに違いないと思ってもう少し調べてみました。
他の言語やライブラリで今日のはじまりって手軽に取得できるのでは?
こういう処理ってきっとみんなが欲しい機能だろうし、他の言語、例えばRuby辺りでそれっぽいのがないのか調べてみることにしました。
英語で今日のはじまりっていうニュアンスの表現がちょっと思いつかなかったのですがGet Time Object at Start of Day in a Particular Time Zoneで
date = Date.today
date.to_time.in_time_zone('America/New_York').beginning_of_day
というのがあって、
「なるほど、beginning_of_dayっていう言い方がされるのか」
ということに気づき、Momentjsのドキュメントを見たら
というそのもののやつがありました(^_^;)
これを使うことで
beginningOfDay = moment().startOf('day') # Wed Nov 05 2014 00:00:00 GMT+0900 (JST)
endOfDay = moment().endOf('day') # Wed Nov 05 2014 23:59:59 GMT+0900 (JST)
という感じでスマートに意図した値が取得できるようになりました
まとめ
- Momentjs使って処理書いててなんとなくスマートじゃないなぁと思ったらそこで諦めない
- JavaScriptに限定せず他の言語でどう実装されているのかググってみると意外とヒントになることが見つかる(かも)