【问题标题】:How can I specify a timezone to use for a single ActiveRecord create or update operation?如何指定用于单个 ActiveRecord 创建或更新操作的时区?
【发布时间】:2015-04-21 23:53:55
【问题描述】:

我知道我能做到:

Time.use_zone("St. Petersburg"){
  Foo.create!(
    topic: "foo", begins_at: "2015-06-01", ends_at: "2015-06-02"
  )
}

有没有更优雅的方法来做到这一点?比如:

Foo.create!(
  topic: "foo", begins_at: "2015-06-01", ends_at: "2015-06-02",
  timezone: "St. Petersburg"
)

【问题讨论】:

  • 为什么要使用当地时间的时间戳?它会使任何查询或比较变得非常复杂。
  • *_at 列是 postgres 的 timetamp without time zone。我的应用程序中所有表的所有日期时间列的所有数据都是 UTC,包括在这种情况下。用户提供的数据在用户的时区中。所以在上面的第一个代码示例中,用户提交的数据在写入数据库之前被有效地转换为 UTC。

标签: ruby-on-rails activerecord timezone


【解决方案1】:

一个选项:

Foo.create!(
  topic: "foo", 
  begins_at: DateTime.parse("2015-06-01").in_time_zone('St. Petersburg'), 
  ends_at:   DateTime.parse("2015-06-02").in_time_zone('St. Petersburg')
)

【讨论】:

  • 问题在于没有一种简单的方法可以从用户提交的内容中获取日期时间,因为表单将其作为一组独立的整数(年、月、日、... )。所以我不得不手工将它们组装在一起,而错过了 activerecord 的便利性。我想另一种方法是f = Foo.new(...); f.begins_at = f.begins_at.in_time_zone(...); f.save
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多