Railsで時間を登録するとき

Shunsuke Sawada

いっつもこんな感じでやっている。
皆はどうやっているんだろうか…?

例えば、ニュースレター/メルマガの配信予約とか。
  

newsletters_controller.rb

ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    def create
        @newsletter = Newsletter.new(strong_params)
        set_right_time
        if @newsletter.save
            redirect_to somewhere_path
        else
            flash[:error] = "Error."
            render 'new'
        end
    end

    private

        def set_right_time
            if @newsletters.will_send_at.present?
                Time.zone = "Asia/Tokyo"
                @newsletter.will_send_at = Time.zone.parse(strong_params[:will_send_at]).utc
            end
        end

最初にタイムゾーンを設定して、
フォームから入ってきた文字列をパースしてTimeに変換、さらにそれをUTCに変換して保存している。
ユーザーは日本にいて、日本のサービスの場合。

タイムゾーンはこちらを参照。TZの欄です。
List of tz database time zones - Wikipedia, the free encyclopedia
  

表示は、UTCを日本時間に変換する。

erb
1
<%= @newsletter.will_send_at.in_time_zone('Asia/Tokyo').strftime('%Y-%m-%d %H:%M') %>

なんだか回りくどいけど、時間はUTCで保存しておいた方が色々と便利だと思うから。
以上です。
  

Shunsuke Sawada

おすすめの記事

EC2でインスタンスを立ち上げてCapistranoでGithubからWordpressをデプロイするまで
Rails / データを時間単位で集計する
Android Studio をアップデートしたらエミュレータが動作しなくなった