使用 strftime 解析日期

Parsing date using strftime

我在解析使用 Nokogiri 抓取网站的日期时遇到问题。我使用

抓取日期时间
@date = h4.at('time[itemprop="startDate"]')[:datetime]

这给了我 2015-04-28 19:30:00 UTC,它被插入到我的日期列中,类型为 "datetime"。

使用 strptime 我试图将日期解析为 "dd/mm" 格式,并将其输入到我的 Rails table:

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

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

非常感谢任何帮助。

您不需要 strftime,您可以使用 parse 解析日期。只需将字符串转换为 Date 对象并将其分配给您的 ActiveRecord 属性:

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

下面是一些可能有用的代码:

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"

解析为日期对象只存储年月日信息。

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' 并且会因美国日期而爆炸,而且速度较慢,因为它会在放弃之前尝试多种格式。因此,使用您期望的固定格式是可行的方法,但您需要搜索您希望找到的 date/datetime 字符串的各种格式,并编写要匹配的格式字符串。而且,由于您正在抓取页面,因此有可能找到很多 bad/malformed 值,因此要进行防御性编程。