2017-04-10 139 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

相關問題