You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby运行函数时出现Time.parse参数越界错误的解决方案咨询

Ruby代码执行时输出内容但抛出ArgumentError错误

运行以下Ruby代码时,程序能输出部分内容,但同时抛出ArgumentError错误(提示argument out of range),错误触发在day = Time.parse(get_date(row))这一行。

原代码

time = Time.parse(@year)
puts "#{time.strftime("%B_%Y")}"
file_path = file_access
CSV.foreach(file_path[0], headers: true, header_converters: :symbol, skip_blanks: true) do|row|
    day = Time.parse(get_date(row)) #Error line
    max = row[:max_temperaturec].to_i
    min = row[:min_temperaturec].to_i
    unless(min.zero? || max.zero?)
      print "#{day.strftime("%d")} "
      unless min.zero?
        min.times{ print '+'.blue }
      end
      unless max.zero?
        min.times{ print '+'.red }
      end
      puts "#{min}C.-.#{max}C"
    end
  end

错误回溯信息

Traceback (most recent call last):
17: from WeatherMan_CompleteProject.rb:20:in `'
    16: from /home/dev/rubyprograms/WeatherMan_Main_CLASS_Complate.rb:155:in `task4'
    15: from /usr/lib/ruby/2.7.0/csv.rb:510:in `foreach'
    14: from /usr/lib/ruby/2.7.0/csv.rb:658:in `open'
    13: from /usr/lib/ruby/2.7.0/csv.rb:511:in `block in foreach'
    12: from /usr/lib/ruby/2.7.0/csv.rb:1280:in `each'
    11: from /usr/lib/ruby/2.7.0/csv.rb:1280:in `each'
    10: from /usr/lib/ruby/2.7.0/csv/parser.rb:336:in `parse'
     9: from /usr/lib/ruby/2.7.0/csv/parser.rb:823:in `parse_quotable_loose'
     8: from /usr/lib/ruby/2.7.0/csv/parser.rb:49:in `each_line'
     7: from /usr/lib/ruby/2.7.0/csv/parser.rb:49:in `each_line'
     6: from /usr/lib/ruby/2.7.0/csv/parser.rb:52:in `block in each_line'
     5: from /usr/lib/ruby/2.7.0/csv/parser.rb:871:in `block in parse_quotable_loose'
     4: from /usr/lib/ruby/2.7.0/csv/parser.rb:1122:in `emit_row'
     3: from /home/dev/rubyprograms/WeatherMan_Main_CLASS_Complate.rb:156:in `block in task4'
     2: from /usr/lib/ruby/2.7.0/time.rb:375:in `parse'
     1: from /usr/lib/ruby/2.7.0/time.rb:266:in `make_time'

/usr/lib/ruby/2.7.0/time.rb:266:in `local': argument out of range (ArgumentError)

原因分析

错误根源是Time.parse接收到了无法解析为有效日期的字符串,导致Ruby构造时间对象时传入的参数超出合法范围(比如日期为32号、月份为13、格式混乱等)。

解决步骤

1. 定位无效日期字符串

在报错行前添加打印语句,输出get_date(row)的返回值,找到具体的非法日期:

CSV.foreach(file_path[0], headers: true, header_converters: :symbol, skip_blanks: true) do|row|
    date_str = get_date(row)
    puts "当前行日期:#{date_str}" # 打印日期字符串
    day = Time.parse(date_str)
    # 后续代码...
end

2. 使用明确的日期格式解析

不要依赖Time.parse的自动推断,改用Time.strptime指定CSV中日期的具体格式(比如日期格式是YYYY-MM-DD),避免自动解析出错:

# 假设日期格式为年-月-日
day = Time.strptime(get_date(row), "%Y-%m-%d")

如果格式不匹配,会直接抛出明确错误,便于排查。

3. 捕获异常跳过无效行

添加异常捕获逻辑,遇到无效日期时跳过该行,避免程序崩溃:

CSV.foreach(file_path[0], headers: true, header_converters: :symbol, skip_blanks: true) do|row|
    begin
      day = Time.parse(get_date(row))
    rescue ArgumentError => e
      puts "跳过无效行:#{row},错误信息:#{e.message}"
      next
    end
    # 后续代码...
end

内容的提问来源于stack exchange,提问作者Rabab Zahra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:36:15