使用 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 值,因此要进行防御性编程。
我在解析使用 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 值,因此要进行防御性编程。