如何将数组中的日期转换为特定格式

时间:2017-04-10 18:10:08

标签: ruby

我有一系列日期,日期有不同的格式。我想将它们全部转换为相同的格式,但是我尝试过的却给我带来了一些问题。

我从SQL查询中获取日期:

table_birth_dates = self.class.connection("SELECT birth_date FROM #{temp_table_name}").values

给了我一系列日期:

[
    [0] "10/3/80",
    [1] "10/3/81",
    [2] "10/3/01",
    [3] "33/33/1970",
]

我想把这一年当作上面的一整年。

我试过了:

table_birth_dates.first.to_time

得到了:

ArgumentError: argument out of range

我也尝试过:

Date.strptime(table_birth_dates)

得到了:

no implicit conversion of Array into String

有没有人有任何想法?

4 个答案:

答案 0 :(得分:0)

如果所有日期与前3个日期的格式相同,则可以使用此格式更改日期的格式:

dates.map! do |date|
    Date.strptime(date, '%d/%m/%y').strftime('%d/%m/%Y')
end 

如果你有不同格式的日期,你可以列出你拥有的格式,并尝试解析每个格式,看看你是否得到了有效的结果,但33/33/1970之类的日期根本不是有效日期。 / p>

答案 1 :(得分:0)

解析日期并不像人们在第一次开始使用它们时所假设的那样简单,因为日期在世界各地的表现方式不同。

'10/3/80'

代表美国格式化日期的“1980年10月3日”,但在世界其他地方将是“1980年3月10日”。并且,除非您告诉它使用哪个软件,否则软件不知道它是什么。而且,如果您的数据来自世界各地,除非您知道生成数据的区域设置,或者除非它们明确告诉您它的格式,否则您无法分辨。

require 'date'

Date.strptime('10/3/80', '%m/%d/%y') # => #<Date: 1980-10-03 ((2444516j,0s,0n),+0s,2299161j)>
Date.strptime('10/3/80', '%d/%m/%y') # => #<Date: 1980-03-10 ((2444309j,0s,0n),+0s,2299161j)>

答案 2 :(得分:0)

正如其他人已经说过的那样:不要将任意字符串存储为日期!使用数据库并将日期存储为日期或日期时间。请参阅数据库文档。 (见@ the-tin-man的评论。)

那说你可以用你当前的日期尝试以下内容:

table.map! { |date|
  date_hash = Date._strptime(date, '%m/%d/%Y') # {:mon=>10, :mday=>3, :year=>70}

  if date_hash.nil?
    'invalid'
  else
    date_hash[:year] = date_hash[:year] + 1900 if date_hash[:year] < 1000
    Date.new(date_hash[:year], date_hash[:mon], date_hash[:mday])
  end
}

这为您提供了一个包含实际日期的数组:

[
  1980-10-03
  1981-10-03
  1901-10-03
  invalid
]

当然,您应该对此invalid采取一些措施,但这符合您的主要目的。

答案 3 :(得分:-2)

从DB中,以整数格式显示日期并转换回任何特定格式。

您是否将数据库中的日期存储为字符串并尝试将其转换为唯一格式以进行显示?如果是这样,您可以在存储值时进行更正(或)在DB中添加一个列,只要插入/更新日期列并从新列检索就会更新。