【问题标题】:converting a hash string into a date object ruby将哈希字符串转换为日期对象 ruby
【发布时间】:2020-09-06 17:33:02
【问题描述】:

我从文件中创建了一个散列,其中包含不同格式的字符串日期(如1988 年9 月,另一行是1960 年7 月11 日,有时年份)

require 'date'

def create_book_hash(book_array)
  {
    link: book_array[0],
    title: book_array[1],
    author: book_array[2],
    pages: book_array[3].to_i,
    date: book_array[4],
    rating: book_array[5].to_f,
    genre: book_array[6]
  }
end

def books_sorted_by_date (books_array)
    books_array.sort_by { |key| Date.strptime(key[:date], '%Y, %m') }
  end

book_file= File.read("books.txt")
    .split("\n")
    .map { |line| line.split("|")}
    .map { |book_array| create_book_hash(book_array)}
puts books_sorted_by_date(book_file)

我正在尝试按日期对书籍进行排序,因此它将按年份升序排列,并且由于我有不同的字符串类型,我将哈希键作为strptime 中的第一个参数来访问以下中的所有值:日期 。这给了我 \strptime': invalid date (Date::Error).` 我不明白为什么以及如何将这些字符串转换为日期对象? (只有红宝石,没有轨道)

【问题讨论】:

  • 我们可以看看你的数据集吗?您的“books.txt”文件

标签: ruby


【解决方案1】:

处理标准和自定义日期字符串

Date#parse 在所有情况下都不能处理任意字符串。即使这样做,它也可能无法按您期望的方式处理它们。例如:

parse_date "1/1/18"
#=> #<Date: 2001-01-18 ((2451928j,0s,0n),+0s,2299161j)>

虽然 Date#parse 自动处理许多日期格式,但它只能成功解析符合其内部预期的对象。当您有多种或任意日期格式时,您必须使用 Date#strptime 定义自己的日期规范来处理 Date#parse 不理解或处理不正确的那些格式。例如:

require 'date'

def parse_date str
  Date.parse str
rescue Date::Error
  case str
  when /\A\d{4}\z/
    Date.strptime str, '%Y'
  when /\A\d{2}\z/
    Date.strptime str, '%y'
  else
    raise "unexpected date format: #{str}"
  end
end

date_samples = ["July 11th 1960", "September 1988", "1776"]

date_samples.map { |date| parse_date(date) }
#=> [#<Date: 1960-07-11 ((2437127j,0s,0n),+0s,2299161j)>, #<Date: 1988-09-01 ((2447406j,0s,0n),+0s,2299161j)>, #<Date: 1776-01-01 ((2369731j,0s,0n),+0s,2299161j)>]

这显然不是潜在格式的详尽列表,但您可以向 date_samples 添加更多示例并更新案例语句以包含您期望从数据集中获得的任何明确的日期格式。

【讨论】:

    【解决方案2】:

    Date.strptime 需要两个参数 date-string 和 date 的格式。要使用 strptime,您需要事先知道字符串的格式。

    在此处查看一些示例 - https://apidock.com/ruby/Date/strptime/class

    在您的程序中,您在解析时不知道该行日期的确切格式,因此您需要尝试类似 -

    def books_sorted_by_date (books_array)
        books_array.sort_by { |key| Date.parse(key[:date]) }
      end
    

    Date.parse 需要一个参数 - 日期字符串,然后它会尝试猜测日期。 查看详情 - https://apidock.com/ruby/v2_6_3/Date/parse/class

    使用这种方法,您仍然会遇到仅一年的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-29
      • 2015-04-02
      • 2010-11-05
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      相关资源
      最近更新 更多