2009-12-27 38 views
4

这是一个让我疯狂的日子!数据正确存储到数据库(sqlite3)。但是,当我显示记录中的日期时,Rails似乎会将其强制为2000年1月1日 - 具有正确的时间。换句话说,如果我将其指定为日期时间:2009年12月31日下午6:00,sqllite3实际上将显示2009-12-31 18:00:00。但是...... Rails将显示2000年1月1日06:00 PM的值(保持正确的时间)。为什么Rails总是显示日期时间为1/1/2000 - 使用正确的时间

我已经创建了虚拟属性来处理日期格式(这似乎工作正常)。并且,我已将我的时区设置为:

config.time_zone = 'Eastern Time (US & Canada)' 

我必须相信这是简单的事情......它完全推动我坚果!!

谢谢!

约翰

+0

这可能是由您的虚拟属性造成的。你可以发布一些代码吗? – 2009-12-27 18:25:21

+0

我可以...除了在实现虚拟属性之前发生此问题。此外,数据正在正确写入数据库,所以它会出现setter工作正常。 getter使用的是与railscast相同的技术。 – user145110 2009-12-27 18:57:12

+0

只要我回到我的电脑,我会发布属性getter和setter代码。 – user145110 2009-12-27 18:59:56

回答

3

那么......我发现了这个问题。事实证明,当rails创建表时,它使用时间数据类型。虽然日期时间值的日期部分将存储在时间字段中,但看起来在读取时间字段时,rails只会考虑时间部分。

修复..在无奈之下,我修改了列为datetime类型。这解决了它。

约翰

0

我也有这个问题。要添加一些有关该问题的信息: - 在调试标记(<%=调试对象%>)中,时间和日期是正确的,但在未经调试使用时(<%= object.year%>) 2000年是

人们可以预期的两件事情之一:

  • 属性:时间只有时间(小时,分,秒等),并希望看到在数据库中的信息(不日期(年,月,日))

xor

  • 属性:时间有时间和日期,并且该信息将转到数据库(包括转换到对象)。

实际上,rails有两个选项。恕我直言,这是一个错误。 我是否正确?或者我没有看到轨道设计的一些要点?

5

我有同样的问题,使用postgres,并感谢user145110建议使用DateTime类而不是时间。这对我有效。我只会补充说,尽管我必须将迁移更改为使用DateTime,但我仍然可以在与DateTime值进行比较的测试中使用Time及其方法。换句话说,用这种原始的迁移:

t.time :start_time 

...和样本分配使用时间:

start_time = Time.now.beginning_of_day 

...它保存好,但在后来读它,今年改为2000年。也许这是一个旧的千年虫问题。大声笑。相反,我只是改变了迁移:

t.datetime :start_time 

..和我所有的代码工作。即使这样的作业:

start_time = Time.zone.now.beginning_of_year.beginning_of_day 

虽然,我不禁感觉像我想念的东西。其他人使用时间操纵日期吗?

相关问题