传统方法见:http://www.cnblogs.com/chentianwei/p/9369904.html

⚠️: 两个方法最后都要有controller中的类似before_action :set_time_zone来给当前浏览器分配时区。

实时方法,根据user的时区设置:

  1. rails new -m template.rb timezone 使用模版,名字用timezone
  2. yarn add jstz   #一个javascrit timezone library 可以自动侦测和设置用户的time zone。
  3. rails g migration AddTimeZoneToUsers time_zone
  4. rails db:migrate
  5. atom.后打开javascript/packs/application.js(已经安装使用webpacker)
  6. 输入import jstz from 'jstz'
    1. import jstz from 'jstz'
    2. const timezone = jstz.determine()
    3. console.log(timezone.name())
  7. app/views/shared/_head.html.erb
  8. 修改第8行,改为 javascript_pack_tag方法。
  9. 在user注册页,f.time_zone_select :time_zone选项,通过它可以在inspect上看到时区的选择。
  10. 在javascript/packs/application.js设置cookie:

创建函数--设置一个Cookie:

function setCookie(name, value) {

var expires = new Date()

expires.setTime(expires.getTime() +  (24*60*60*1000))  #1000天后到期

document.cookie= name + ''=" + value + ';expires=' + expires.toUTCString()

}

使用这个函数:

setCookie("timezone", timezone.name())

解析这些都是JavaScript的用法,create, Read a Cookie with JavaScript:

var x = document.cookie      获得当前document的关联的cookies。

document.cookie = newCookie 设置新的Cookie。

例子:

document.cookie= "username=John Doe;   expires=Thu, 18 Dec 2013 12:00:00 UTC;   path=/";

扩展--JavaScript Cookies:

https://www.w3schools.com/js/js_cookies.asp

  

  12. 在Application.rb中 Controller中定义一个方法 bowser_time_zone

def browser_time_zone

#根据cookies来找到对应的时区,如果没有则使用Time.zone作为默认,任意错误,营救也使用默认

browser_tz = ActiveSupport::TimeZone.find_tzinfo(cookies[:timezone])

ActiveSupport::TimeZone.all.find{ |zone|  zone.tzinfo ==  browser_tz }  || Time.zone

rescue TZInfo::UnknownTimezone,  TZInfo::InvalidTimezoneIdentifier

Time.zone

end

helper_method :browser_time_zone  #添加helper方法

变量browser_tz是如#<TZInfo::DataTimezone: America/Chicago>的对象, 它会和所有TimeZone对象的属性tzinfo做比较。

#<ActiveSupport::TimeZone:0x00007f97f26b0058 @name="American Samoa", @utc_offset=nil, @tzinfo=#<TZInfo::DataTimezone: Pacific/Pago_Pago>>

  13.在user注册页,f.time_zone_select :time_zone选项可以加上这个browser_time_zone helper方法

<%= f.time_zone_select :time_zone, nil, default: browser_time_zone.name %>

  14. 浏览器显示时区时间:controller增加一个before_action :set_time_zone, if: :user_signed_in?

def set_time_zone

Time.zone = current_user.time_zone

end

  15 有一个相关gem 'local_time'可以利用。

(GoRails) 自动侦测用户的时区,使用javascript 的jszt库。的更多相关文章

  1. 轻量高效的开源JavaScript插件和库 【转】

    图片 布局 轮播图 弹出层 音频视频 编辑器 字符串 表单 存储 动画 时间 其它 加载器 构建工具 测试 包管理器 CDN 图片 baguetteBox.js - 是一个简单易用的响应式图像灯箱效果 ...

  2. 顶级的JavaScript框架、库、工具及其使用

    几乎每隔一个星期,就有一个新的 JavaScript 库席卷网络社区!Web 社区日益活跃.多样,并在多个领域快速成长.想要研究每一个重要的 JavaScript 框架和库,是个不可能完成的任务.接下 ...

  3. 2016 年 50 个最佳的轻量级 JavaScript 框架和库

    作者:IT程序狮链接:https://zhuanlan.zhihu.com/p/24598210来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 回顾今年已发布的 JS ...

  4. 推荐12个最好的 JavaScript 图形绘制库

    众多周知,图形和图表要比文本更具表现力和说服力.图表是数据图形化的表示,通过形象的图表来展示数据,比如条形图,折线图,饼图等等.可视化图表可以帮助开发者更容易理解复杂的数据,提高生产的效率和 Web  ...

  5. 20个优秀的 JavaScript 键盘事件处理库

    键盘事件是 Web 开发中最常用的事件之一,通过对键盘事件的捕获和处理可以提高网站的易用性和交互体验.下面,我们向大家介绍收集的20款优秀的 JavaScript 键盘事件处理库,帮助开发人员轻松处理 ...

  6. 2016年31款轻量高效的开源JavaScript插件和库

    目前有很多网站设计师和开发者喜欢使用由JavaScript开发的插件和库,但同时面临一个苦恼的问题:它们中的大多数实在是太累赘而且常常降低网站的性能.其实,其中也有不少轻量级的插件和库,它们不仅轻巧有 ...

  7. 第一百三十五节,JavaScript,封装库--拖拽

    JavaScript,封装库--拖拽 封装库新增1个拖拽方法 /** tuo_zhuai()方法,将一个弹窗元素实现拖拽功能 * 注意:一般需要在css文件将元素里的某一个区块光标设置成提示可以拖拽, ...

  8. 第一百三十三节,JavaScript,封装库--弹出登录框

    JavaScript,封装库--弹出登录框 封装库,增加了两个方法 yuan_su_ju_zhong()方法,将获取到的区块元素居中到页面,chuang_kou_shi_jian()方法,浏览器窗口事 ...

  9. Tippy.js – 轻量的 Javascript Tooltip 工具库

    工具提示(Tooltip)在网站中的一个小功能,但却有很重要的作用,常用于显示一些温馨的提示信息.如果网站中的工具提示功能做得非常有创意的话能够加深用户对网站印象.Tippy.js 是一款帮助你快速创 ...

随机推荐

  1. SQL查询日历

    这东西给自己留着用. 经常会用到一些查询需要做全月统计,但有些时候的统计需要将未发生日期也显示出来,因此会需要一个固定的日期表,(T6的自定义查询估计也是需要的,至少以前是这样) 下面写两种方法来获取 ...

  2. Linux命令: 替换字符串

    敲命令按以下顺序 ①vim filename ②e ③i ④ESC 1    :s/str1/str2    把当前行的第一个str1替换成str2 2    :s/str1/str2/g    把当 ...

  3. linux常用命令:wc 命令

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...

  4. 什么是IO多路复用?Nginx的处理机制

    先来说一下什么是IO复用? IO复用解决的就是并发行的问题,比如多个用户并发访问一个WEB网站,对于服务端后台而言就会产生多个请求,处理多个请求对于中间件就会产生多个IO流对于系统的读写.那么对于IO ...

  5. C++设计模式 之 “数据结构” 模式:Composite、Iterator、Chain of Resposibility

    "数据结构"模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用.这时候,将这些特定数据结构封装在内部,在外部提供统一的接口, ...

  6. 《网络攻防》实验九:web安全基础实践

    本次实验在XX同学的指导下完成 1.实验后回答问题 (1)SQL注入攻击原理,如何防御 SQL注入攻击的基本原理,是从客户端合法接口提交特殊的非法代码,让其注入到服务器端执行业务的SQL中去,进而改变 ...

  7. HDU 2571(dp)题解

    命运 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  8. Java 创建多线程的三种方法

    1. 继承Thread类2. 实现Runnable接口3. 匿名类的方式 注: 启动线程是start()方法,run()并不能启动一个新的线程

  9. springboot中配置主从redis

    测试redis的主从配置 redis实例 文件夹名称如下 redis_master_s redis_slaver1_s redis_slaver2_s redis.conf文件 master的redi ...

  10. html文件引用本地js文件出现跨域问题的解决方案

    在本地做个小demo,很简单,一个html文件,一个js文件,在html文件中通过<script>标签引入js,但是出现了一个意想不到的问题:浏览器报错—— 一番折腾后,终于弄明白了:加载 ...