Rails列类型为moment.js格式化日期和时间

时间:2017-01-23 07:57:52

标签: ruby-on-rails date model momentjs

我正在构建一个rails应用程序,用户从日期选择器中获取日期,从时间选择器中获取时间。使用时刻js格式化日期和时间以按以下方式显示日期和时间:

moment().format('LL'); //January 23,2017
moment().format('LTS'); //1:17:54 PM

我阅读了这个答案,并附有关于选择合适的色谱柱类型的指南。 Is there documentation for the Rails column types?

理想情况下,我应该使用:date,:time或:timestamp。但由于格式化了日期,我应该使用:string而不是吗?

在这种情况下使用哪种正确且合适的列类型?

2 个答案:

答案 0 :(得分:1)

您可以在数据库中有一个timestamp列,然后将请求解析为ruby datetime对象,如下所示:

d = Time.parse(params[:date])
t = Time.new(params[:time])
dt = DateTime.new(d.year, d.month, d.day, t.hour, t.min, t.sec, t.zone)
#now simply use dt to your datetime column

在Postgres上,您可以将ruby DateTime对象直接保存到postgres 时间戳字段,例如

  User.first.update_attribute('updated_at', dt )

另一个选择是将你的日期和时间字符串连接成一个,然后你可以做一个单行:

  User.last.update_attribute('created_at', Time.parse('January 23,2017 1:17:54 PM'))

我很确定这也适用于MySQL日期时间或时间戳。

归功于大卫·格雷森Ruby: combine Date and Time objects into a DateTime

答案 1 :(得分:1)

如果要在数据库中存储时间参考,则应使用数据库为您提供的类型之一。我将使用MySQL(这是我最常用的那个)解释这个,但其他数据库服务器的解释应该类似。

  • 如果你使用timestamp列,你将只使用4个字节的存储空间,这总是一个好新的,因为它制作较小的索引,在内部数据库操作期间使用较少的内存表中的内存和等等。但是,timestamp的范围小于datetime,因此您只能存储从1970年到2038年的值或多或少

  • 如果您使用datetime,您将能够以相同的精度(秒)存储更广泛的范围(从1001年到9999年)。不好的结果是更高的范围需要更多的内存,使其稍慢。

这两种列类型之间存在一些不适合这个答案的差异,但在决定之前应该留意。

  • 如果你使用varchar这是Ruby on Rails中文本属性的默认列类型,那么每次你需要使用它时,你将被迫从文本转换为日期时间,反之亦然。领域。此外,对该列进行排序或过滤效率非常低,因为数据库需要在过滤或排序之前将所有字符串转换为日期,从而无法在该列上使用索引。

  • 如果您需要亚秒精度,您可以使用bigint来满足您的要求,因为MySQL没有为此目的提供特定日期类型

一般情况下,如果您的申请要求符合timestamp限制,我建议您使用timestamp。否则,请使用datetime,但我强烈建议您不要将varchar用于此目的。

编辑:格式化

在数据库中存储日期的方式与向用户显示日期的方式完全不同。您可以使用DateTime创建DateTime.new(year, month, day, hour, minute, second)对象,并将该对象分配给模型。当您将其保存到数据库中时,ActiveRecord将负责将DateTime对象转换为适当的数据库格式。

为了以特定格式(在视图,API响应等中)显示已存储在数据库中的值,您可以查看其他帖子,例如this one