`
wtb
  • 浏览: 106030 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

rails中使用tzinfo-timezone实现各时区时间转换

阅读更多
结合http://marklunds.com/articles/one/311
和手册,完整的一个实现各时区时间转换的一个例子:

首先保证服务器安装tzinfo插件

 gem install  tzinfo

1、配置环境
ruby 代码
 
  1. ActiveRecord::Base.default_timezone = :utc   

2、相应的类中
ruby 代码
  1. require 'tzinfo'  

3、某模型中有一个字段为time_zone,string类型,用来存储用户设置的他所在的时区
ruby 代码
 
  1. class User < ActiveRecord::Base  
  2.   composed_of :tz:class_name => 'TZInfo::Timezone',   
  3.               :mapping => %w(time_zone name)
  4. #回调函数对tz进行赋值
  5. def after_find
       self.tz=TZInfo::Timezone.new(self.time_zone)
  6. end
  7. end  

4、新建用户时,使用下面select
ruby 代码
 
  1. <%= time_zone_select 'user', 'timezone_name', TZInfo::Timezone.all.sort, 
  2.    :model => TZInfo::Timezone %>  

5、新建action中
ruby 代码
 
  1. @user.tz=TZInfo::Timezone.new(params[:user][:timezone_name])  

6、相应的helper中
ruby 代码
 
  1. def format_datetime(datetime)  
  2.    return datetime if !datetime.respond_to?(:strftime)  
  3.    datetime = @user.tz.utc_to_local(datetime) if @user  
  4.    datetime.strftime("%m-%d-%Y %I:%M %p")  
  5.  end  

7、相应的view中得到本地时间
ruby 代码
 
  1. <%= format_datetime(Time.now) %>  

8、action中转换时间
ruby 代码
 
  1. def new  
  2.  @email.schedule_date = @user.tz.utc_to_local(Time.now) # Default schedule date in local time  
  3. end  
  4. def create  
  5. @email.schedule_date = @user.tz.local_to_utc(@email.schedule_date)  
  6. end  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics