我在解析使用Nokogiri抓取网站所采用的日期时遇到问题。我使用
刮掉日期时间@date = h4.at('time[itemprop="startDate"]')[:datetime]
这为我提供了2015-04-28 19:30:00 UTC
,它插入到我的日期列中,类型为“datetime”。
使用strptime
我试图将日期解析为“dd / mm”格式,并将其输入到我的Rails表中:
Date.strptime(@date, "%Y-%m-%d %H:%M:%S %Z").strftime("%m/%d/%Y")
@event=Event.new
@event.date= @date
非常感谢任何帮助。
答案 0 :(得分:2)
以下是一些可能有用的代码:
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'而且会夸大美国日期,而且速度较慢,因为它在放弃之前会尝试多种格式。因此,使用您期望的固定格式是要走的路,但您需要搜索您期望找到的各种格式的日期/日期时间字符串,并编写匹配的格式字符串。而且,既然你正在抓页,就有可能找到很多不良/格式不正确的值,所以要防范程序。
答案 1 :(得分:0)
您不需要strftime
,您可以使用parse
解析日期。只需将字符串转换为Date对象并将其分配给ActiveRecord属性:
@event = Event.new
@event.date = Date.parse('2015-04-28 19:30:00 UTC')