如何在rails中使用to_date?

时间:2013-12-21 10:50:00

标签: ruby ruby-on-rails-4

Ruby 2.0

控制器操作

@date = "2013-12-21"
@new_date = @date.to_date
p @new_date

o / p:2013年12月21日星期六

在视图

<%= @new_date %>

o / p:2013-12-21

我想要观看“星期六,2013年12月21日”

5 个答案:

答案 0 :(得分:2)

Rails is so intelligent that it automatically calls视图中的所有对象都不是通过方法.to_s字符串,它始终将对象的内容转换为字符串< / em>的

让我先找出根本原因,为什么会出现这样意外的输出:

kirti@kirti-Aspire-5733Z:~/workspace/testproject$ rvm use 1.9.3
Using /home/kirti/.rvm/gems/ruby-1.9.3-p484
kirti@kirti-Aspire-5733Z:~/workspace/testproject$ rails c
Loading development environment (Rails 3.2.16)
1.9.3p484 :001 > d = "2013-12-21".to_date
 => Sat, 21 Dec 2013 
1.9.3p484 :002 > d.to_s
 => "2013-12-21" 
1.9.3p484 :003 > d
 => Sat, 21 Dec 2013 
1.9.3p484 :004 > d.class
 => Date 
1.9.3p484 :005 > d.strftime('%a, %e %b %Y')
 => "Sat, 21 Dec 2013" 
1.9.3p484 :006 > 

"2013-12-21".to_date为您提供Date个实例,而不是String个实例。d.class证明了这一点。 d是一个Date个实例,我在开始时再次调用to_s方法,因此Sat, 21 Dec 2013再次被设置回"2013-12-21" }。所以你的解决方案将是:

@date = "2013-12-21".to_date.strftime('%a, %e %b %Y')

"2013-12-21".to_date.strftime('%a, %e %b %Y')会在字符串实例( 接收器 >上为String实例提供所需的结果。 )如果您申请to_s,您将获得相同的 接收器 。现在,您可以在视图中使用此@date变量。

答案 1 :(得分:0)

在Ruby 2.0中的控制器动作中:

@date = "2013-12-21"

@new_date = @date.to_date

# => Sat, 21 Dec 2013

在视图中使用@new_date

答案 2 :(得分:0)

根据我的理解,你得到了

2013-12-21

但想要

Sat, 21 Dec 2013

它在控制台中输出的原因很简单,因为控制台会自动为您格式化。这可以通过在控制台中打印@new_date.to_s来验证,它将是未格式化的版本。要以您想要的方式在屏幕上打印出来,您必须自己格式化。

你应该像这样使用strftime

@new_date = @new_date.strftime('%a, %e %b %Y')

@date.to_date.strftime('%a, %e %b %Y')

这将正确输出2013年12月21日星期六。

答案 3 :(得分:0)

@new_date.strftime('%a, %e %b %Y')

直接在视图上使用它。

答案 4 :(得分:0)

在Rails中格式化日期对象的最佳方法是使用可用的I18n formatters

<%= l @ new_date, format: :long %>

如指南中所述,您还可以创建其他格式。例如,如果没有默认值与您想要的格式匹配,只需定义

即可
# config/locales/en.yml
en:
  time:
    formats:
      custom: "%a, %e %b %Y"

然后使用

<%= l @ new_date, format: :custom %>