在Ruby on Rails中,DateTime,Timestamp,Time和Date之间的区别是什么?

Nic*_*May 402 time datetime timestamp ruby-on-rails date

根据我的经验,在编程时获得正确的日期/时间总是充满危险和困难.

如果仅仅由于绝大多数的选择,Ruby和Rails总是在这个问题上找不到我; 我从来不知道应该选哪个.

当我使用Rails并查看ActiveRecord数据类型时,我可以找到以下内容

:datetime,:timestamp,:time和:date

并且不知道差异是什么或者潜伏在哪里.

有什么不同?你用它们做什么的?

(PS我正在使用Rails3)

von*_*rad 559

ActiveRecord中不同日期/时间格式之间的差异与Rails几乎没有关系,而且与您正在使用的任何数据库有关.

使用MySQL作为一个例子(如果没有其他原因,因为它是最流行的),你有DATE,DATETIME,TIMETIMESTAMP列数据类型; 就像你有CHAR,VARCHAR,FLOATINTEGER.

所以,你问,有什么区别?好吧,其中一些是不言自明的.DATE只存储一个日期,TIME只存储一天中的某个时间,同时DATETIME存储两者.

DATETIME和之间的区别TIMESTAMP有点微妙:DATETIME格式化为YYYY-MM-DD HH:MM:SS.有效范围从1000年到9999年(以及介于两者之间的所有内容.虽然从数据库中获取它时TIMESTAMP 看起来很相似,但它实际上只是unix时间戳的前沿.其有效范围从1970年到2038年.差异这里,除了数据库引擎中的各种内置函数之外,还有存储空间.由于DATETIME存储了年,月,日,时,分和秒中的每个数字,它总共消耗了8个字节.TIMESTAMP仅存储数量自1970-01-01以来的秒数,它使用4个字节.

您可以在此处阅读有关MySQL中时间格式之间差异的更多信息.

最后,它归结为您需要的日期/时间列.您需要在1970年之前或2038年之后存储日期和时间吗?使用DATETIME.您是否需要担心数据库大小并且您在该时间范围内?使用TIMESTAMP.你只需要存储日期吗?使用DATE.你只需要存储时间吗?使用TIME.

说完所有这些之后,Rails实际上会为你做出一些决定.双方:timestamp:datetime会默认为DATETIME,而:date:time对应于DATETIME分别.

这意味着在Rails中,您只需要决定是否需要存储日期,时间或两者.

  • @ n13很好,但在Rails中并不是真正的问题,因为它在将日期时间插入数据库之前转换为UTC. (31认同)
  • 这是Rails Universe中最有用的帖子之一.这应该添加到导轨指南... (13认同)
  • 为了记录,我更喜欢绝对时间戳(unix),因为YYYY-MM-DD格式取决于所使用的时区.因此,客户端需要知道服务器的时区,并需要进行转换.自1970年以来的秒数绝对时间戳没有这个问题. (7认同)
  • 这在其他dbs中是一样的吗?比如postgres? (6认同)
  • MySQL的"TIME"列不是严格意义上的"时间",因为它接受小时> 24; 它也可用作"经过时间". (4认同)

小智 18

  1. :datetime(8个字节)

    • 存储日期和时间格式YYYY-MM-DD HH:MM:SS
    • 对于像birth_date这样的列很有用
  2. :时间戳(4个字节)

    • 存储自1970-01-01以来的秒数
    • 对于像updated_at,created_at这样的列很有用
  3. :日期(3个字节)
    • 商店日期
  4. :时间(3个字节)
    • 存储时间

  • 这更像上面接受的答案的TL:DR版本 (2认同)