我created_at
时间戳都存储在UTC:从一个时区转换时间到另一个Rails的
>> Annotation.last.created_at
=> Sat, 29 Aug 2009 23:30:09 UTC +00:00
如何转换其中之一为“东部时间(美国&加拿大)”(考虑到日光储蓄)?喜欢的东西:
Annotation.last.created_at.in_eastern_time
我created_at
时间戳都存储在UTC:从一个时区转换时间到另一个Rails的
>> Annotation.last.created_at
=> Sat, 29 Aug 2009 23:30:09 UTC +00:00
如何转换其中之一为“东部时间(美国&加拿大)”(考虑到日光储蓄)?喜欢的东西:
Annotation.last.created_at.in_eastern_time
使用DateTime类
Loading development environment (Rails 2.3.2)
>> now = DateTime.now.utc
=> Sun, 06 Sep 2009 22:27:45 +0000
>> now.in_time_zone('Eastern Time (US & Canada)')
=> Sun, 06 Sep 2009 18:27:45 EDT -04:00
>> quit
这样的in_time_zone方法为您具体的例子
Annotation.last.created_at.in_time_zone('Eastern Time (US & Canada)')
你的时区设置为美国东部时间。
您可以设置默认的时区到config/environment.rb
config.time_zone = "Eastern Time (US & Canada)"
现在你拉出来的所有记录将在该时区。如果你需要不同的时区,比如基于用户时区,你可以在你的控制器中用before_filter来改变它。
class ApplicationController < ActionController::Base
before_filter :set_timezone
def set_timezone
Time.zone = current_user.time_zone
end
end
只要确保您将所有时间都存储在数据库中,并且UTC一切都会很好。
我会避免'Time.zone = ..'因为它不是线程安全的。 – gertas 2010-12-08 15:48:07
如果您正在运行像杂种,瘦客户或乘客这样的应用程序服务器,这会影响吗?他们运行多个实例,我认为单线程?我可能是错的,很想知道! – nitecoder 2010-12-12 22:40:12
'Time.zone ='是线程安全的https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/time/zones.rb#L36-38。 – lest 2012-08-21 09:36:14
如果您添加到您的/config/application.rb
config.time_zone = 'Eastern Time (US & Canada)'
然后你就可以细胞
Annotation.last.created_at.in_time_zone
获得在指定的时区的时间。
虽然这是一个老问题,但值得一提的是。在previous reply建议使用before_filter临时设置时区。
你应该从来没有,永远这样做,因为Time.zone存储信息在线程中,它可能会泄漏到该线程处理的下一个请求。
相反,您应该使用around_filter以确保在请求完成后重置Time.zone。喜欢的东西:
around_filter :set_time_zone
private
def set_time_zone
old_time_zone = Time.zone
Time.zone = current_user.time_zone if logged_in?
yield
ensure
Time.zone = old_time_zone
end
了解更多关于这个here
现在有一个不错的[Time.use_zone](https://apidock.com/rails/Time/use_zone/class)方法。 – freemanoid 2017-09-04 19:41:46
如果您配置/config/application.rb
config.time_zone = 'Eastern Time (US & Canada)'
Time.now.in_time_zone
DateTime.now.in_time_zone
或者你可以使用小时的ident'now.in_time_zone(3)'' – fl00r 2011-03-24 13:00:14
created_at.in_time_zone (“EST”)更短 – Orlando 2012-06-14 18:00:06
“EST”=“东部标准时间”,因此在夏令时期间会出错。 “东部时间(美国和加拿大)”会计算出您的DST是否为DST。 – jhiro009 2012-08-22 20:49:26