使用strftime解析日期

时间:2015-04-28 19:09:29

标签: ruby-on-rails ruby strptime

我在解析使用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

非常感谢任何帮助。

2 个答案:

答案 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')