【问题标题】:Time zone difference时区差异
【发布时间】:2019-12-29 13:27:09
【问题描述】:

我正在尝试使用 Rails 教程开发应用程序。 我在第12章和麻烦。 当我从密码重置表单发送电子邮件但 reset_at 时间添加错误时间。 在控制台中,我可以获得正确的时间。 有谁能帮助我吗?谢谢。

models/user.rb

def create_reset_digest
    self.reset_token = User.new_token
    update_attribute(:reset_digest, User.digest(reset_token))
    update_attribute(:reset_sent_at, Time.zone.now)
end

在控制台中(“reset_sent_at”时间不对)

>> User.first
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2019-12-27 19:18:17", updated_at: "2019-12-29 13:03:12", password_digest: "$2a$10$jbZmEQiB6reX6e/ieGC4wu1lVALDE0GHlkPPeIbUaGe...", remember_`enter code here`digest: nil, admin: true, activation_digest: "$2a$10$t2pk3NPXsvpYcVlrnB4nh.jOZu4YEyKih5wMqneuia2...", activated: true, activated_at: "2019-12-27 19:18:17", reset_digest: "$2a$10$UExX5u5qsCrwuCzyz5xicObm9w98.XWHQuxoDT7vlzC...", reset_sent_at: "2000-01-01 13:03:12">

在控制台中(我可以得到正确的时间)

Time.zone.now
=> Sun, 29 Dec 2019 22:23:40 JST +09:00
>> 

为什么?

【问题讨论】:

  • 我认为时间戳几乎相同。 2019-12-29 13:03:12 距离 2019 年 12 月 29 日 22:23:40 JST +09:00 仅 20 分钟,只是写法不同。 Time.zone.now是在更新 20 分钟后做的吗?

标签: ruby-on-rails ruby time


【解决方案1】:

我解决了这个问题。 当我向下面这样的用户表添加列时,我犯了一个错误。

class AddAdtivationToUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :activation_digest, :string
    add_column :users, :activated, :boolean, default: false
    add_column :users, :activated_at, :datatime # here is the point of mistake. 
                                                # I should have write ":datetime"
  end
end

【讨论】:

  • 在数据库中存储本地时间是一种非常糟糕的反模式做法。正确的方法是存储 UTC 并在需要时转换回本地时区。存储本地时间会遇到许多意想不到的问题。
猜你喜欢
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 2018-09-16
  • 2015-07-13
  • 2020-06-06
相关资源
最近更新 更多