下面是一些代碼,可以幫助:
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',並且會炸燬美國日期,而且速度較慢,因爲它在放棄之前會嘗試多種格式。因此,使用固定格式您期望的是要走的路,但您需要搜索各種格式的日期/日期時間字符串,您可以期望找到並編寫匹配的格式字符串。而且,由於您正在抓取頁面,因此可能會發現很多錯誤/不正確的值,因此需要進行防禦性編程。
你有什麼問題? – infused
我一直在亂它一會兒,我要麼得到「無效日期」或日期顯示在我的索引未格式化爲「2015-04-28 19:30:00 UTC」 – bokeken3
是event.date一個' datetime'字段在你的模型?如果是這樣,你不能只使用'DateTime.parse'嗎?這被設計爲將日期和時間的ASCII表示轉換爲'datetime'。引用是http://ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html#method-c-parse。 –