根据我的经验,在编程时正确的日期/时间总是充满危险和困难。
Ruby和Rails在这一点上总是避开我,即使仅仅是因为有大量的选择;我从来都不知道该选哪一个。
当我使用Rails并查看ActiveRecord数据类型时,可以找到以下内容
:datetime, :timestamp, :time, and :date
不知道有什么区别,也不知道哥特人潜伏在哪里。
有什么区别?你用它们做什么?
(P.S.我用的是铁轨3)
ActiveRecord中不同日期/时间格式之间的差异与Rails和您使用的任何数据库都没有什么关系。
以MySQL为例(如果没有其他原因,因为它最流行),你有DATE、DATETIME、TIME和TIMESTAMP列数据类型;就像你有CHAR、VARCHAR、FLOAT和INTEGER一样。
所以,你问,有什么区别?嗯,其中有些是不言自明的。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分别对应于DATE和TIME。
这意味着在Rails中,您只需要决定是否需要存储日期、时间或两者都需要。
- 对于记录,我更喜欢绝对时间戳(Unix),因为YYYY-MM-DD格式取决于所使用的时区。所以客户机需要知道服务器的时区,并且需要进行转换。自1970年以来,绝对时间戳没有这个问题。
- @N13很好,但在Rails中不是真正的问题,因为它在将日期时间插入数据库之前转换为UTC。
- 这是Rails领域中最有用的帖子之一。这应该添加到Rails指南…
- MySQL的TIME列并不是严格意义上的"一天中的时间",因为它接受的小时数大于24;它也可用作"经过的时间"。
- 其他星展银行也是这样吗?例如邮局?
- 在最后一段的第二段中,您的意思是当从关联模型中读取时,datetime列类型将被转换为(ruby)datetime吗?Rails(ActiveRecord)实际对此字段类型使用ActiveSupport::TimeWithZone。
- 那么ActiveSupport::TimeWithZone呢,这是什么?我需要一些关于PostgeSQL的内容。
- ActiveSupport::TimeWithZone是一个类,其作用类似于标准的ruby TIME类,但可以处理任何可能的时区,与只处理UTC和系统时区的时间不同。api.rubyonrails.org/classes/activesupport/timewithzone.html版本
- 2038年后unixtimestamp是否会重置为0000000,以便他们可以再次使用timestamp?或者计划是什么?
:日期时间(8字节)
- 存储日期和时间格式为YYYY-MM-DD hh:mm:ss
- 适用于出生日期等列
:时间戳(4字节)
- 存储1970-01-01以来的秒数
- 适用于更新的列,创建的列
日期(3字节)
时间(3字节)