Rails未定义方法“strftime”用于“2013-03-06”的字符串。

10
我遇到了错误:
当我尝试使用 strftime 将字符串 "2013-03-06" 转换成正常的日期格式 (如:2013年6月星期三 或类似的格式) 时,出现了undefined method `strftime' for "2013-03-06":String 的错误信息。
在我的 index.html.erb 中,处理这段代码的行看起来像这样: <%= task.duedate.strftime("%B %e, %Y") %> 由于我刚开始学习Rails,所以我相信这只是一个初学者的愚蠢错误,希望能得到帮助。谢谢。

1
d = Date.today # 2008-08-12 d.strftime('%b %d, %Y') # 将打印出 August 12, 2008 - Hackerman
你的duedate字段为什么不是Date或DateTime类型?是否有特殊原因? - Marcelo De Polli
在迁移中添加并填充日期列后,我遇到了这个问题。解决方案很简单,只需要重新启动 (我猜 Rails 在那之前不知道该属性是日期类型?)。 - thewillcole
5个回答

41

看起来你的截止日期是一个字符串,而strftime是时间/日期类的一个方法。你可以尝试这样做:

Date.parse(task.duedate).strftime("%B %e, %Y")

2
这个对我解决了问题:
Date.created_at.try(:strftime, ("%B %e, %Y"))

希望这可以帮助你!

这对我有用 - 因为有时候值是 null。谢谢。 - Xander

0
我也遇到了这个问题,后来在controller.rb文件中创建了一个方法,将日期从字符串格式转换为datetime对象,然后在保存数据到数据库之前,在create函数中调用了这个方法。
  def convert_to_date(date_as_string)
    #expecting date format in "yyyy-mm-dd" format
    if date_as_string.length > 0
      split_date = date_as_string.split('-')
      return Date.new(year=split_date[0].to_i, month=split_date[1].to_i, 
      day=split_date[2].to_i) 
    else
      return nil 
    end 
  end 

0

你也可以使用strptime。这对我很有效 :)

DateTime.strptime(task.duedate ,"%B %e, %Y") 

0
您将日期时间存储为字符串而不是实际的日期时间。您需要创建一个新的迁移,如下所示:
change_table :tasks do |t|  
  t.change :duedate, :datetime 
end

这样,当您访问duedate时,它将已经被解析为日期时间对象,而不是每次都需要进行转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接