`
暮雨风吹
  • 浏览: 16703 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

rails mysql 日期格式问题

 
阅读更多
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://virusswb.blog.51cto.com/115214/1046723

MySQL中的时区

显示时区信息

  1. mysql>showvariableslike'%time_zone%';
  2. +------------------+--------+
  3. |Variable_name|Value|
  4. +------------------+--------+
  5. |system_time_zone|CST|
  6. |time_zone|SYSTEM|
  7. +------------------+--------+
  8. 2rowsinset(0.00sec)

设置时区信息

+8:00是中国所在的时区,东八区。

  1. mysql>settime_zone='+8:00';
  2. QueryOK,0rowsaffected(0.00sec)

Rails中的时区

rails默认就是写入utc时间,然后读取也是utc时间。

设置config.time_zone只能保证写入数据库的时间是local,就是保证创建对象的时候created_at和updated_at使用设置的本地时间。

但是读出来的时候还是有可能是utc时间,有可能需要在界面上转换的。

rails推荐使用utc时间,这样就统一了,只是在界面显示的时候格式化为本地时间。

  1. raketime:zones:all#查看所有时区
  2. raketime:zones:local#查看本地时区

默认情况

我们使用

  1. railsg scaffold posttitle:stringcontent:string

生成一个model之后,打开【db/migrate/201200_create_posts.rb】文件看到下面的内容。

  1. classCreatePosts<ActiveRecord::Migration
  2. defchange
  3. create_table:postsdo|t|
  4. t.string:title
  5. t.string:content
  6. t.timestamps
  7. end
  8. end
  9. end

t.timestamps会帮我们在数据库中生成created_at和updated_at两个字段,这两个字段rails会自动赋值不用我们手动指定。

在界面上添加post之后,打开log/production.log文件,会看到下面的内容。

  1. INSERTINTO`posts`(`category_id`,`content`,`created_at`,`picture`,`published`,`title`,`updated_at`,`url`)VALUES(1,'post100','2012-11-0105:13:45',NULL,0,'post100','2012-11-0105:13:45','post100')

如果没有看到这条sql语句,那么就是在config/applicaiton.rb中添加

  1. config.log_level=debug

debug的级别会在日志中记录每个sql,方便调试。在发布到生产环境之后,修改这个级别信息。

请注意created_at的值,明明是中国时间中午插入的记录,但是insert语句中的时间却是utc时间,落后八个小时,因为中国是东八区+8:00。

插入数据库的值自然也就是这个utc时间。

设置时区之后

解决这个问题可以在config/application.rb文件中添加下面的配置。

  1. config.active_record.default_timezone=:local
  2. config.time_zone='Beijing'

再次插入数据,打开log文件,就会发现时间变成了北京时间,插入数据库的也是北京时间。进入mysql -u root -p之后,查询的结果也是北京时间。

在view文件中使用

  1. <%=created_at%>

显示的结果是

  1. 2012-11-0113:39:26+0800

是没有问题的,但是多了时区+0800信息。

要是使用

  1. <%=post.updated_at.to_s(:db)%>

显示的结果就是

  1. 2012-11-0105:39:26

没有了+0800,但是时间又变成了utc时间了。

使用

  1. <%=post.updated_at.localtime.to_s(:db)%>

就变成

  1. 2012-11-0113:39:26

这下没有时区+0800信息,时间也是本地时间了。就是先转换为本地时间,然后在进行格式化。

  1. created_at.utc #转换为utc时间
  2. created_at.localtime #转换为local时间

还有就是在rails console中有一点特别。

  1. 1.9.3-p286:013>p=Post.last
  2. PostLoad(0.3ms)SELECT`posts`.*FROM`posts`ORDERBY`posts`.`id`DESCLIMIT1
  3. =>#<Postid:67,title:"发郭德纲的法国队",content:"asdfasdf",created_at:"2012-11-0105:39:26",updated_at:"2012-11-0105:39:26",url:"df",category_id:1,published:false,picture:nil>
  4. 1.9.3-p286:014>p.created_at
  5. =>Thu,01Nov201213:39:26CST+08:00

大家注意到了吗,在p=Post.last之后查询的结果显示created_at的时间是utc时间,但是等你敲入p.created_at之后,显示的值就变成了本地时间。

总结

时区以及日期的格式化是每个程序员的必修课,就像字符串的各种处理一样重要,而且使用频率很高。

rails默认就是写入utc时间,然后读取也是utc时间。

设置config.time_zone只能保证写入数据库的时间是local,就是保证创建对象的时候created_at和updated_at使用设置的本地时间。

但是读出来的时候还是有可能是utc时间,有可能需要在界面上转换的。

rails推荐使用utc时间,这样就统一了,只是在界面显示的时候格式化为本地时间。

对于任何应用来说,遇到时区问题,都应该考虑语言本身和存储本身,甚至是操作系统本身的时区设置和一些默认值,这样才能最终较好的解决时区问题。

参考文献

1.Convert local time to UTC in Rails

2.Rails 3 default datetime format without UTC

3.rails 有关时区的设置的问题

4.Date Time Format in RUBY

5.rails time format

6.完美解决rails中国时区时间设置

7.Time Zones in Rails 2.1

8.MySQL时区设置

9.Rails内置的时间格式化

本文出自 “突破中的IT结构师” 博客,请务必保留此出处http://virusswb.blog.51cto.com/115214/1046723

分享到:
评论

相关推荐

    Ruby on Rails安装及MySQL数据库配置指南

    在安装和配置 Ruby on Rails 和 MySQL 数据库的过程中,可能会遇到一些问题。例如,在创建 POSTS 应用时可能会遇到问题,创建数据后数据库中有数据,但是到 Listing posts 界面无法查看,总是报错。解决方法是下载 ...

    配置高可用的rails

    优化rails应用的响应时间可以从数据库查询优化、视图渲染优化、静态资源服务优化等多方面着手。 - Web框架基准测试:了解不同Web框架的性能基准,可以帮助我们选择合适的工具和优化手段。基准测试能够提供不同框架...

    ruby on rails 开发环境包(ruby1.8.7,rails2.2.3)

    然而,值得注意的是,随着时间的推移,Ruby和Rails都有了显著的发展,最新的版本提供了更多的特性和安全性改进。如果可能,建议升级到更现代的版本,以利用最新的技术和最佳实践。但是,如果你正在维护一个老项目或...

    rails-1.0.0

    随着时间的推移,Rails不断进化,引入了更多新特性,如ActiveJob(后台任务处理),Action Cable(实时通信)等,但其核心理念始终未变,即提供一个强大而优雅的框架,让开发者更专注于创造有价值的应用。

    ruby on rails社区网站开发源码

    9. **辅助方法(Helper)**:辅助方法可以在视图中使用,帮助处理复杂的展示逻辑,如格式化日期、链接生成等。 10. **测试(Testing)**:Rails提供了一套强大的测试工具,如RSpec和Capybara,用于编写功能测试、...

    Ruby on Rails环境搭建(基于WinXP & RadRails)

    这个过程可能需要一段时间,因为Rails及其依赖会下载并安装。 为了方便数据库操作,我们需要安装数据库驱动。如果你计划使用SQLite,只需在命令行输入`gem install sqlite3`。如果选择MySQL,你需要先安装MySQL...

    rails操作.docx

    Rails默认支持MySQL数据库,无需额外安装驱动。为了使用数据库,需要先创建数据库,然后在Rails项目中配置数据库连接信息。Rails的数据库操作主要通过ActiveRecord实现,它是一种ORM(对象关系映射)工具,使得Ruby...

    Ruby on Rails 初体验--北大青鸟教师专题讲座PPT

    为了开发RoR应用,开发者可以选择各种开发环境,如InstantRails智能安装包,或者单独安装Ruby、Rails和MySQL,还可以使用如RadRails、NetBeans或Eclipse等IDE工具。 通过一个简单的通讯录应用为例,可以快速体验RoR...

    ruby on rails安装

    Rails允许你通过`config/application.rb`文件调整各种设置,如时间区、编码、数据库配置等。此外,你还需要安装其他可能的依赖库,比如开发工具集`bundle install`,这将根据`Gemfile`中的定义安装所有必需的gem。 ...

    ruby和rails简介

    此外,Rails默认支持MySQL数据库,无需额外安装驱动。 安装Ruby的过程相对简单,支持Windows、Linux和OS X等多个操作系统。在Windows下,可以选择安装版,并通过`ruby.exe`和`rubyw.exe`执行Ruby程序。验证Ruby安装...

    rails安装.rar

    Rails是Ruby语言的一个著名Web应用框架,全称为Ruby on Rails,简称RoR。...在实际开发过程中,遇到问题不要害怕,Rails社区非常活跃,你可以在Stack Overflow等平台上找到很多帮助。祝你在Rails的世界里探索愉快!

    ruby on rails 实例depot

    10. **辅助方法(Helper Methods)**:Rails的助手方法可以在视图中使用,帮助处理复杂的逻辑,如链接生成、格式化日期等。 11. **测试(Testing)**:Rails提供了一套完整的测试框架,包括单元测试、集成测试和...

    ruby on rails 安装手记

    这个过程可能需要一段时间,因为它会下载并安装Rails及其依赖库。如果你遇到权限问题,可能需要使用`sudo`命令,例如在Unix或MacOS系统上: ```bash sudo gem install rails ``` 安装完成后,可以通过运行`rails -...

    Redmine 搭建 Ruby_Ruby_on_Rails 项目管理系统

    它支持多种数据库类型,并能够与其他版本控制系统(如 SVN、CVS 等)以及问题追踪系统集成,提供了丰富的功能如时间跟踪、文档管理和工作流管理等。 **Ruby on Rails**(简称 Rails 或 ROR)则是一个用于开发 Web ...

    ruby1.8.6 + rails2.0.2 安装配置 详细说明

    在本文中,我们将深入探讨如何在您的计算机上安装和配置Ruby 1.8.6、Rails 2.0.2、RadRails 0.7.2 IDE以及MySQL数据库。这是一个适用于初学者和有一定经验的开发者的技术指南,旨在帮助您创建一个稳定的开发环境,...

    ruby 1.8.7 rails 2.3.4

    在 Ruby on Rails 应用中,如果使用 MySQL 作为数据库,这个库可能会在运行时被调用,特别是在使用 ActiveRecord 进行数据库交互时。 综上所述,这些内容涉及了 Ruby 语言的基本特性,Rails 框架的关键功能,以及与...

    Ruby On Rails傻瓜书

    - **数据库集成**:介绍如何将不同的数据库系统(如SQLite、MySQL等)集成到Rails项目中。 - **ActiveRecord ORM**:深入理解Rails内置的ActiveRecord对象关系映射技术,简化数据库操作。 ##### 6. 进阶主题 - **...

    Ruby On Rails For Dummies

    - **最佳实践**:随着时间的发展,社区中形成了许多关于 Rails 开发的最佳实践,比如使用 Git 进行版本控制、采用 CI/CD 流水线进行持续集成等。 **总结** 《Ruby on Rails For Dummies》这本书旨在为初学者提供一...

    Rails缓存架构设计

    - **多进程的分布式应用架构部署**:采用多进程或多节点部署方式,确保即使某个节点出现问题也不会影响整个系统的运行。 - **REST架构风格**:使用RESTful架构设计Web服务,有利于实现松耦合的服务,并充分利用缓存...

Global site tag (gtag.js) - Google Analytics