2015-04-28 49 views
1

我有一個問題,解析使用Nokogiri從網站刮取日期。我湊型「日期時間」的使用使用strftime解析日期

@date = h4.at('time[itemprop="startDate"]')[:datetime] 

日期時間這讓我2015-04-28 19:30:00 UTC,其插入我的日期列。

使用strptime我試圖日期解析爲「DD/MM」的格式,並將其輸入到我的Rails表:

Date.strptime(@date, "%Y-%m-%d %H:%M:%S %Z").strftime("%m/%d/%Y") 

@event=Event.new 
@event.date= @date 

任何幫助將是非常讚賞。

+1

你有什麼問題? – infused

+0

我一直在亂它一會兒,我要麼得到「無效日期」或日期顯示在我的索引未格式化爲「2015-04-28 19:30:00 UTC」 – bokeken3

+1

是event.date一個' datetime'字段在你的模型?如果是這樣,你不能只使用'DateTime.parse'嗎?這被設計爲將日期和時間的ASCII表示轉換爲'datetime'。引用是http://ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html#method-c-parse。 –

回答

1

下面是一些代碼,可以幫助:

require 'date' 
require 'time' 

date = Date.strptime('2015-04-28 19:30:00 UTC', "%Y-%m-%d %H:%M:%S %Z") 
# => #<Date: 2015-04-28 ((2457141j,0s,0n),+0s,2299161j)> 
date.strftime('%m/%d/%y') 
# => "04/28/15" 

解析成Date對象只存儲年份,月份和日期信息。

datetime = DateTime.strptime('2015-04-28 19:30:00 UTC', "%Y-%m-%d %H:%M:%S %Z") 
# => #<DateTime: 2015-04-28T19:30:00+00:00 ((2457141j,70200s,0n),+0s,2299161j)> 
datetime.strftime('%m/%d/%y') 
# => "04/28/15" 

time = Time.strptime('2015-04-28 19:30:00 UTC', "%Y-%m-%d %H:%M:%S %Z") 
# => 2015-04-28 19:30:00 UTC 
time.strftime('%m/%d/%y') 
# => "04/28/15" 

解析成DateTime或Time對象捕獲所有信息。

您看到的錯誤通常是由您不期望的格式的日期字符串引起的。當你期望「mm/dd/yy」順序的值,但實際上以「dd/mm/yy」順序接收值時,通常會發生這種情況。這是因爲美國利用 'MM/DD/YY' 和世界上大多數國家的其他部分使用 'DD/MM/YY':

date = Date.strptime('2015-28-04', '%Y-%m-%d') 
# ~> -:7:in `strptime': invalid date (ArgumentError) 

date = Date.strptime('28-04-2015', '%m-%d-%Y') 
# ~> -:7:in `strptime': invalid date (ArgumentError) 

您可以解決這通過使用一些rescue語句來嘗試幾種不同的格式。

你不想使用parse,因爲它會假設'dd/mm/yyyy',並且會炸燬美國日期,而且速度較慢,因爲它在放棄之前會嘗試多種格式。因此,使用固定格式您期望的是要走的路,但您需要搜索各種格式的日期/日期時間字符串,您可以期望找到並編寫匹配的格式字符串。而且,由於您正在抓取頁面,因此可能會發現很多錯誤/不正確的值,因此需要進行防禦性編程。

+0

感謝錫人,對我缺乏堆棧溢出禮儀表示歉意。非常感謝你的幫助。我的問題是,我有一個循環,它通過事件列表來查看事件列表,查看它們的日期,然後將它們輸入到我的事件表中,我將如何去解析這個日期列表,而不僅僅是一個日期?例如我參加的日期是2015-04-28 19:30:00 UTC,2015-04-29 19:30:00 UTC,2015-04-30 19:30:00 UTC等 – bokeken3

+0

got它:),和平 – bokeken3

+0

你需要把這種信息放入你的問題。問題越完善,越快,越好,你會得到回答。要回答這個問題,你可以循環做。 –

0

你不需要strftime,你可以用parse解析日期。只需將字符串轉換成Date對象,並分配給您的ActiveRecord屬性:

@event = Event.new 
@event.date = Date.parse('2015-04-28 19:30:00 UTC') 
+0

「你不需要strftime,你可以用解析來解析日期。」是的,如果速度不是問題。 –