2017-01-23 65 views
0

我正在构建一个Rails应用程序,用户从日期选择器中选取一个日期,并从时间选取器中选取一个时间。这两个日期和时间一直在使用瞬间JS显示下列方式的日期和时间格式:用于moment.js的Rails列类型格式化日期和时间

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

我看了这个答案提供有关正确的列类型的选择准则。 Is there documentation for the Rails column types?

理想情况下,我应该使用:date,:time或:timestamp。但由于日期格式化,我应该使用:字符串呢?

在这种情况下,哪种类型的正确和适当的列类型?

回答

1

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

  • 如果你使用你会只用4个字节存储空间,这始终是一个很好的新的,因为它使较小的索引,在内部数据库操作等使用的时态表的内存较少的timestamp列。然而,timestamp有一个较小的范围比datetime所以你只能够存储从1970年值高达2038年或多或少

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

这两个列类型之间还有一些不符合此答案的其他区别,但在决定之前应该留意。

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

  • 如果你需要亚秒级的精度,可以使用bigint满足你的要求,因为MySQL不会为了这个目的

在一般情况下,如果我建议使用timestamp提供一个日期特定类型的应用要求符合timestamp限制。否则,请使用datetime,但我强烈建议您为此使用varchar

编辑:格式化

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

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

+0

谢谢!我是否需要以任何特定格式转换日期以将其存储在:timestamp或datetime?因为我将收到用户的月份DD,YYYY和时间为小时:分钟:秒上午/下午 –

1

您可以在数据库中有一个时间戳列,然后解析请求的红宝石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的你可以节省红宝石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

+0

所以我可以有一个日期格式化以任何方式存储在:日期列类型下?日期应该在哪里没有特定的格式? –

+0

由于您需要日期和时间,因此不能使用日期。列 –

+0

使用时间戳或日期时间将需要任何其他格式?像删除逗号和所有? –