【问题标题】:Ruby on Rails invalid date error when parsing datetime string to convert to a different formatRuby on Rails 解析日期时间字符串以转换为不同格式时出现无效日期错误
【发布时间】:2014-01-05 12:23:23
【问题描述】:

在我的 Rails 应用程序(Rails 2.3.14 和 Ruby 1.8.7)中,我试图将日期时间字符串转换为不同的格式以在我的 MySQL 数据库上执行搜索,但我收到了 invalid date 错误,我可以'似乎不明白为什么,我已经阅读了很多类似的问题,但我似乎仍然无法解决这个问题。

# check if filter contains a time stamp
if params[:sSearch].include?('/') and params[:sSearch].include?(':')
  datetime = DateTime.strptime(params[:sSearch], "%Y-%m-%d %H:%M")
  params[:sSearch] = datetime
end

示例场景

04/11/13 16:14

应该转换为

2013-11-04 16:14

我认为这可能与秒不包含在字符串的前端表示中这一事实有关,因为数据库表中的精确 datetime2013-11-04 16:14:52 所以我现在包含了秒但仍然出现相同的错误,我认为这并不重要,因为我在搜索词的任一侧使用带有通配符的 LIKE 操作数,所以即使没有秒数,它也应该可以工作。

【问题讨论】:

    标签: ruby-on-rails ruby datetime ruby-on-rails-2 strptime


    【解决方案1】:

    您应该在格式中使用斜杠并将%Y(四位数字年份)替换为%y(缩写为两位数字年份)以获得所需的结果。此外,日期字段的顺序是颠倒的。正确的格式是:

    "%d/%m/%y %H:%M"
    

    我认为您混淆了strptimestrftime 的用途。而strptime 中的p 代表“解析”(从String 制作DateTime),strftime 中的f 代表“格式”(另一个方向)。

    require 'date'
    
    DateTime.strptime("04/11/13 16:14", "%Y-%m-%d %H:%M")
    # ArgumentError: invalid date
    
    DateTime.strptime("04/11/13 16:14", "%d/%m/%Y %H:%M")
    #=> #<DateTime: 0013-11-04T16:14:00+00:00 ((1722836j,58440s,0n),+0s,2299161j)>
    # Wrong! You do not want the year 0013, but 2013
    
    DateTime.strptime("04/11/13 16:14", "%d/%m/%y %H:%M")
    #=> #<DateTime: 2004-11-13T16:14:00+00:00 ((2453323j,58440s,0n),+0s,2299161j)>
    # Correct
    

    您可以稍后使用 DateTime#strftime 将其转换为所需的格式,如下所示:

    # parse the user input to a DateTime object
    datetime = DateTime.strptime("04/11/13 16:14", "%d/%m/%y %H:%M")
    
    # reformat it
    params[:sSearch] = datetime.strftime("%Y-%m-%d %H:%M")
    

    【讨论】:

    • 你是这个网站上最聪明的人。
    • 我很谦虚,但我怀疑 ;-)
    【解决方案2】:

    你的模板有问题,试试:DateTime.strptime("04/11/13 16:14", "%d/%m/%y %H:%M")

    【讨论】:

    • 我以为解析是内置在strptime函数中的? -ruby-doc.org/stdlib-2.0.0/libdoc/date/rdoc/…。我宁愿不要仅仅为了这一点点功能而使用 gem。
    • “我宁愿不为这点小功能使用 gem。”?您正在使用 Rails;它是由一大堆宝石组成的。编写良好的 gem 不会比使用标准库中的东西产生任何成本,它只是不是 Ruby 发行版的一部分。
    • 我认为他的意思是如果他不需要,他宁愿不使用 gem,chr​​onic 是一个不错的 gem,但如果你不需要它的功能,可能会有点矫枉过正。
    【解决方案3】:

    strptime 使用给定格式将给定字符串转换为日期时间对象。

    DateTime.strptime("04/11/13 16:14", "%m/%d/%y %H:%M").strftime("%Y-%m-%d %H:%M")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-12
      • 2012-05-18
      • 2019-12-14
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多