Rails+MySQL开发中的时间问题

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

 

MySQL中的时区

显示时区信息

 
  1. mysql> show variables like '%time_zone%'; 
  2. +------------------+--------+ 
  3. | Variable_name    | Value  | 
  4. +------------------+--------+ 
  5. | system_time_zone | CST    | 
  6. | time_zone        | SYSTEM | 
  7. +------------------+--------+ 
  8. 2 rows in set (0.00 sec) 

 

设置时区信息

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

 
  1. mysql> set time_zone = '+8:00'
  2. Query OK, 0 rows affected (0.00 sec) 

 

Rails中的时区

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

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

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

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

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

 

默认情况

我们使用

 
  1. rails g scaffold post title:string content:string 

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

 
  1. class CreatePosts < ActiveRecord::Migration 
  2.   def change 
  3.     create_table :posts do |t| 
  4.       t.string :title 
  5.       t.string :content 
  6.  
  7.       t.timestamps 
  8.     end 
  9.   end 
  10. end 

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

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

 
  1. INSERT INTO `posts` (`category_id`, `content`, `created_at`, `picture`, `published`, `title`, `updated_at`, `url`) VALUES (1, 'post100', '2012-11-01 05:13:45', NULL, 0, 'post100', '2012-11-01 05: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-01 13:39:26 +0800 

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

要是使用

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

显示的结果就是

 
  1. 2012-11-01 05:39:26 

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

使用

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

就变成

 
  1. 2012-11-01 13: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.   Post Load (0.3ms)  SELECT `posts`.* FROM `posts` ORDER BY `posts`.`id` DESC LIMIT 1 
  3.  => #<Post id: 67, title: "发郭德纲的法国队", content: "asdfasdf", created_at: "2012-11-01 05:39:26", updated_at: "2012-11-01 05:39:26", url: "df", category_id: 1, published: false, picture: nil>  
  4. 1.9.3-p286 :014 > p.created_at 
  5.  => Thu, 01 Nov 2012 13:39:26 CST +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时间,这样就统一了,只是在界面显示的时候格式化为本地时间。

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




本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/1046723,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
存储 关系型数据库 MySQL
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
49 0
|
3月前
|
关系型数据库 MySQL 数据库
Linux C/C++ 开发(学习笔记七):Mysql数据库C/C++编程实现 插入/读取/删除
Linux C/C++ 开发(学习笔记七):Mysql数据库C/C++编程实现 插入/读取/删除
49 0
|
4月前
|
关系型数据库 MySQL Docker
利用docker 开发 信息系统,python + mysql + flask + jquery
利用docker 开发 信息系统,python + mysql + flask + jquery
59 2
|
6月前
|
存储 Java 关系型数据库
JSP考试质量分析系统myeclipse开发mysql数据库bs框架java编程web网页结构
JSP 考试质量分析系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语言开发,系统主要采用B/S模式开发。
185 1
|
3月前
|
NoSQL 关系型数据库 MySQL
基于Python和mysql开发的智慧校园答题考试系统(源码+数据库+程序配置说明书+程序使用说明书)
基于Python和mysql开发的智慧校园答题考试系统(源码+数据库+程序配置说明书+程序使用说明书)
|
3月前
|
NoSQL 关系型数据库 MySQL
基于Python和mysql开发的BBS问答社区管理系统(源码+数据库+程序配置说明书+程序使用说明书)
基于Python和mysql开发的BBS问答社区管理系统(源码+数据库+程序配置说明书+程序使用说明书)
|
2天前
|
SQL 存储 关系型数据库
数据库开发之mysql前言以及详细解析
数据库开发之mysql前言以及详细解析
11 0
|
6天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
9天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
|
6月前
|
存储 Java 关系型数据库
JSP考试质量分析系统myeclipse开发mysql数据库bs框架java编程web网页结构
JSP 考试质量分析系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语言开发,系统主要采用B/S模式开发。
126 0