Rails+MySQL开发中的时间问题

MySQL中的时区

显示时区信息

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)

设置时区信息

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

mysql> set time_zone = '+8:00';

Query OK, 0 rows affected (0.00 sec)

Rails中的时区

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

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

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

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

rake time:zones:all #查看所有时区

rake time:zones:local #查看本地时区

默认情况

我们使用

rails g scaffold post title:string content:string

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

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :title
      t.string :content 

      t.timestamps
    end
  end
end

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

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

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中添加

config.log_level = debug

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

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

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

设置时区之后

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

config.active_record.default_timezone = :local

config.time_zone = 'Beijing'

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

在view文件中使用

<%= created_at %>

显示的结果是

2012-11-01 13:39:26 +0800

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

要是使用

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

显示的结果就是

2012-11-01 05:39:26

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, 时区
, 时间
, config
, local time zone
, 时区问题
, UTC
查询时区
rails mysql、ruby on rails mysql、rails mysql 配置、rails mysql2、rails使用mysql,以便于您获取更多的相关知识。

时间: 2024-10-21 15:46:21

Rails+MySQL开发中的时间问题的相关文章

怎么向mysql数据库中插入时间,且怎么求某两个时间段中的所有记录

问题描述 怎么向mysql数据库中插入时间,且怎么求某两个时间段中的所有记录 解决方案 解决方案二:SimpleDateFormat函数between字段and字段就行了解决方案三:把时间转成String型的给他赋值,取一段时间用sql="...timebetween'"+time1+"'and'"+time2+"'";注意拼接的字符串的单引号

ruby on rails + mysql 开发环境搭建

ror对于初学者来讲,可能最大的困难莫过于开发环境的安装与搭建,今天折腾了大半天基本搞定了,把过程贴在这里,以便初学者少走弯路. 1.安装ruby 1.8.6 打开  http://rubyforge.org/frs/?group_id=167 ,安装 ruby1.8.6-26最终版本 下载完成后,可在命令行下键入 ruby -v验证版本 (如果在命令行里输入ruby提示找到不该命令,请将c:\ruby\bin加入到path环境变量中) 注:这一步完成后,就已经可以在本机体验ruby语言了,默认

PHP与MySQL开发中页面出现乱码的一种解决方法_php技巧

一般来说,乱码的出现有2种原因,首先是由于编码(charset)设置错误,导致浏览器以错误的编码来解析,从而出现了满屏乱七八糟的"天书",其次是文件被以错误的编码打开,然后保存,比如一个文本文件原先是GB2312编码的,却以UTF-8编码打开再保存.要解决上述乱码问题,首先需要知道开发中哪些环节涉及到了编码: 1.文件编码:指的是页面文件(.html,.php等)本身是以何种编码来保存的.记事本和Dreamweaver在打开页面时候会自动识别文件编码因而不太会出问题.而ZendStud

Mysql开发中的外键与参照完整性

参照完整性(Referential integrity)是数据库设计中一个重要的概念.在系统不同的列表中,当数据库所有参照合法或非合法关联时都会涉及到参照完整性.当参照完整性存在时,任何与不存在记录的关联将变得无效化,由此可防止用户出现各种错误,从而提供更为准确和实用的数据库. 参照完整性通常通过外键(foreign key)的使用而被广泛应用.长久以来,流行工具开源RDBMS MySQL并没有支持外键,原因是这种支持将会降低RDBMS的速度和性能.然而,由于很多用户对参照完整性的优点倍感兴趣,

浅析Linux中的时间编程和实现原理(一) Linux应用层的时间编程

引子 我们都生活在时间中,但却无法去思考它.什么是时间呢?似乎这是一个永远也不能被回答的问题.然而作为一个程序员,在工作中,总有那么几次我必须思考什么是时间.比如,需要知道一段代码运行了多久:要在 log 文件中记录事件发生时的时间戳:再比如需要一个定时器以便能够定期做某些计算机操作.我发现,在计算机世界中,时间在不同场合也往往有不同的含义,让试图思考它的人感到迷茫.但值得庆幸的是,Linux 中的时间终究是可以理解的.因此我打算讨论一下有关时间的话题,尝试着深入理解 Linux 系统中 C 语

在mysql数据库中关于日期时间字段的处理

在mysql数据库中关于日期时间字段的处理 在开发中,日期时间字段一般有如下几种设计 假设要获取2013-08-15日到2013-08-16日之间的记录 1. 直接使用日期时间类字段 相关sql语句如下 select * from cms_news where  news_add_time between str_to_date("2013-08-15 00:00:00",'%Y-%m-%d %H:%i:%s') and str_to_date("2013-08-16 23:

请问在jsp开发中使用的mysql server数据库服务器

问题描述 请问在jsp开发中使用的mysql server数据库服务器 请问在jsp开发中使用的mysql server数据库服务器,在Visual C++ 6.0中也可以使用么?如果可以,请问如何使用? 解决方案 到底你说的是mysql还是sql server?不过这两者都可以在VC中访问,具体你google下 解决方案二: 可以吧,但是6.0都是多少年前的版本了,连sql server会出现各种未知的问题,具体google,楼上正解 解决方案三: 应该是可以的,直接都连接同一个数据库不就可以

ios开发中时间转换的方法集锦

  这篇文章主要介绍了ios开发中时间转换的方法集锦,需要的朋友可以参考下 在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理. 例如: //实例化一个NSDateFormatter对象 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //设定时间格式,这里可以设置成自己需要的格式 [dateFormatter setDateFormat:@"yy

Android开发中怎样调用mysql数据库中的数据

问题描述 Android开发中怎样调用mysql数据库中的数据 Android开发中怎样调用mysql数据库中的数据,数据库可以是本地也可以是联网的. 解决方案 Android本地是不能直接调用MySQL的,因为很简单,你的Android手机上面不可能安装MySQL服务的.你只能借助于网络通信, 让手机和电脑通过网络连接起来,这样你想在Android端访问MySQL数据库时,就可以通过一定的方式发送一些网络消息请求, 让电脑端去查询数据库,再通过网络把数据返回给Android端.当然,最简单的网