2017-04-10 146 views
0

我有一个日期数组,其日期格式不同。我想将它们全部转换为相同的格式,但是我尝试过的格式导致了一些问题。如何将数组内的日期转换为特定格式

我从一个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 

有没有人有任何想法?

+0

是的,这是最终我在做什么,我非常确定它'去年'''''''年''。我最终试图标记出sftp导入引入的错误日期(因此1970年的错误日期) – kdweber89

+1

这些日期是以字符串还是其他数据类型存储在数据库中? – moveson

+1

看起来您将日期存储为字符串,而无需在存储之前进行标准化。不要这样做。相反,您应该先将它们转换为日期,然后输出一致的格式。我还建议使用日期字段而不是字符串来存储值。如果您需要查看或比较日期字段而不是使用字符串,数据库将更加高效。 –

回答

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但它符合您的主要目的。

0

如果你日期是在相同的格式作为第3次的约会,你可以使用这个骗子更改日期的格式:

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

如果您有不同格式的日期,你可以列出的格式你有和尝试解析他们每个人,看看你是否得到一个有效的结果,但像33/33/1970日期根本不是一个有效的日期。

+0

这不起作用。许多日期将使用'%d /%m /%y'来解析,但是,如果它们是以美国为中心的,它们将被错误地解析。相反,如果它们不是以美国为中心的,而且你试图像解析它们那样解析它们,那么会有无效的结果和爆炸。你必须知道日期信息的原始格式。 –

-2

从数据库中获取整数格式的日期并转换回任何特定的格式。

您是否将日期存储在数据库中作为字符串并试图将它们转换为独特的格式来显示?如果是这样,则可以在存储值时进行更正(或)在数据库中添加一个列,每当您的日期列被插入/更新并从新列中检索时就会更新该列。

+0

而不是描述解决方案,您应该显示示例代码。像图片一样,代码价值10,000字。 –

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)> 
+0

更不用说,在一个时区输入简单的'日期'可能会导致其他时区中的日期不同,也就是说,在澳大利亚1月1日_1月1日_仍在12月31日在世界大部分地区。 – whodini9

相关问题