Arrays 如何从数组中的日期字符串中删除不需要的字符?

Arrays 如何从数组中的日期字符串中删除不需要的字符?,arrays,ruby,string,date,Arrays,Ruby,String,Date,我有一个包含多个日期和时间的数组: [ "24/Oct/2014:13:43:15 -0600", "25/Oct/2014:14:47:25 -0600", "24/Oct/2014:13:46:15 -0600" ] 我一直在试着让你明白 ["24/Oct/2014", "25/Oct/2014", "24/Oct/2014"] 我曾尝试使用gsub将不需要的内容替换为空白,但只删除了冒号。我如何删除它?只需在:上拆分,然后丢弃其余部分: times = [ "24/Oct/20

我有一个包含多个日期和时间的数组:

[ "24/Oct/2014:13:43:15 -0600",
  "25/Oct/2014:14:47:25 -0600",
  "24/Oct/2014:13:46:15 -0600" ]
我一直在试着让你明白

["24/Oct/2014", "25/Oct/2014", "24/Oct/2014"]

我曾尝试使用
gsub
将不需要的内容替换为空白,但只删除了冒号。我如何删除它?

只需在
上拆分,然后丢弃其余部分:

times = [ "24/Oct/2014:13:43:15 -0600", "25/Oct/2014:14:47:25 -0600", "24/Oct/2014:13:46:15 -0600" ]

times.map do |time|
  time.split(':').first
end

# => ["24/Oct/2014", "25/Oct/2014", "24/Oct/2014"]

如果您想就地执行此操作并修改数组,请使用
map

只需在
上拆分,并丢弃其余部分:

times = [ "24/Oct/2014:13:43:15 -0600", "25/Oct/2014:14:47:25 -0600", "24/Oct/2014:13:46:15 -0600" ]

times.map do |time|
  time.split(':').first
end

# => ["24/Oct/2014", "25/Oct/2014", "24/Oct/2014"]
arr = ["24/Oct/2014:13:43:15 -0600",
       "05/Oct/2014:14:47:25 -0600",
       "24/Oct/2014:13:46:15 -0600"]
如果您想就地执行此操作并修改数组,请使用
map

arr = ["24/Oct/2014:13:43:15 -0600",
       "05/Oct/2014:14:47:25 -0600",
       "24/Oct/2014:13:46:15 -0600"]
如果您确信日期字符串的格式是正确的,并且表示有效的日期,那么只需编写

arr.map { |s| s[0,11] }
  #=> ["24/Oct/2014", "05/Oct/2014", "24/Oct/2014"]
另一方面,如果希望检查日期字符串的有效性,则可能希望将每个日期字符串转换为日期对象,然后将该对象转换为所需的字符串格式。这样,如果日期字符串无效,将引发异常

require 'date'

arr.map { |s| DateTime.strptime(s, '%d/%b/%Y:%H:%M:%S %z').strftime('%d/%b/%Y') }
  #=> ["24/Oct/2014", "05/Oct/2014", "24/Oct/2014"] 
这使用了方法和步骤。日期格式字符串在文档中解释为
strftime

假设

arr = ["42/Oct/2014:13:43:15 -0600"]
然后

您可以改为使用instead of
strtime
将日期字符串转换为
date
对象,但它在识别无效日期方面非常弱。例如:

DateTime.parse "123456/01-02abc"
  #=> #<DateTime: 123456-01-02T00:00:00+00:00 ((46812439j,0s,0n),...
DateTime.parse "-7/8"
  #=> #<DateTime: 2016-07-08T00:00:00+00:00 ((2457578j,0s,0n),...
DateTime.parse "He demanded 1/2 of the pie"
  #=> #<DateTime: 2016-01-02T00:00:00+00:00 ((2457390j,0s,0n),...
dates = [
  "24/Oct/2014:13:43:15 -0600",
  "25/Oct/2014:14:47:25 -0600",
  "24/Oct/2014:13:46:15 -0600"
]

dates.map { |date| date.match(/\A[^:]+/).to_s }
dates.map { |date| date.partition(?:)[0] }
DateTime.parse“123456/01-02abc”
#=> # # #
如果您确信日期字符串的格式是正确的,并且表示有效的日期,那么只需编写

arr.map { |s| s[0,11] }
  #=> ["24/Oct/2014", "05/Oct/2014", "24/Oct/2014"]
另一方面,如果希望检查日期字符串的有效性,则可能希望将每个日期字符串转换为日期对象,然后将该对象转换为所需的字符串格式。这样,如果日期字符串无效,将引发异常

require 'date'

arr.map { |s| DateTime.strptime(s, '%d/%b/%Y:%H:%M:%S %z').strftime('%d/%b/%Y') }
  #=> ["24/Oct/2014", "05/Oct/2014", "24/Oct/2014"] 
这使用了方法和步骤。日期格式字符串在文档中解释为
strftime

假设

arr = ["42/Oct/2014:13:43:15 -0600"]
然后

您可以改为使用instead of
strtime
将日期字符串转换为
date
对象,但它在识别无效日期方面非常弱。例如:

DateTime.parse "123456/01-02abc"
  #=> #<DateTime: 123456-01-02T00:00:00+00:00 ((46812439j,0s,0n),...
DateTime.parse "-7/8"
  #=> #<DateTime: 2016-07-08T00:00:00+00:00 ((2457578j,0s,0n),...
DateTime.parse "He demanded 1/2 of the pie"
  #=> #<DateTime: 2016-01-02T00:00:00+00:00 ((2457390j,0s,0n),...
dates = [
  "24/Oct/2014:13:43:15 -0600",
  "25/Oct/2014:14:47:25 -0600",
  "24/Oct/2014:13:46:15 -0600"
]

dates.map { |date| date.match(/\A[^:]+/).to_s }
dates.map { |date| date.partition(?:)[0] }
DateTime.parse“123456/01-02abc”
#=>####许多带字符串的选项
有很多方法可以将日期字符串作为字符串对象进行操作。在您的案例中,有两个这样的选项包括和。例如:

DateTime.parse "123456/01-02abc"
  #=> #<DateTime: 123456-01-02T00:00:00+00:00 ((46812439j,0s,0n),...
DateTime.parse "-7/8"
  #=> #<DateTime: 2016-07-08T00:00:00+00:00 ((2457578j,0s,0n),...
DateTime.parse "He demanded 1/2 of the pie"
  #=> #<DateTime: 2016-01-02T00:00:00+00:00 ((2457390j,0s,0n),...
dates = [
  "24/Oct/2014:13:43:15 -0600",
  "25/Oct/2014:14:47:25 -0600",
  "24/Oct/2014:13:46:15 -0600"
]

dates.map { |date| date.match(/\A[^:]+/).to_s }
dates.map { |date| date.partition(?:)[0] }
这两种方法都将返回一个字符串数组,如下所示:

#=> ["24/Oct/2014", "25/Oct/2014", "24/Oct/2014"]
考虑 将这样的日期作为字符串对象处理的主要问题是,您假设字符串表示形式总是相同的。如果你知道你的数据,那很好,但通常最好把日期当作日期。例如,您可以使用(带或不带)自动处理常见表示,如下所示:

require 'date'

# Remove #to_s if you want to return actual Date objects for
# further processing, rather than an array of strings.
dates.map { |date| Date.parse(date).to_s }
#=> ["2016-10-24", "2016-10-25", "2016-10-24"]

# This will only return strings, but that's what you originally
# asked for.
dates.map { |date| Date.parse(date).strftime '%d/%b/%Y' }
#=> ["24/Oct/2016", "25/Oct/2016", "24/Oct/2016"]
Date和DateTime库也包含其他解析器。当然,如果使用非标准输入格式,则可以与自定义模板一起使用

这里的要点是munging字符串对象可以工作,但通常最好将日期作为Date或DateTime对象处理,以避免边缘情况、验证输入以及引发异常,如:

dates.map { |date| Date.rfc2822 date }
ArgumentError:无效日期

在适当的时候。只要有可能,您绝对应该利用这样的核心功能。

有许多字符串替代方案 有很多方法可以将日期字符串作为字符串对象进行操作。在您的案例中,有两个这样的选项包括和。例如:

DateTime.parse "123456/01-02abc"
  #=> #<DateTime: 123456-01-02T00:00:00+00:00 ((46812439j,0s,0n),...
DateTime.parse "-7/8"
  #=> #<DateTime: 2016-07-08T00:00:00+00:00 ((2457578j,0s,0n),...
DateTime.parse "He demanded 1/2 of the pie"
  #=> #<DateTime: 2016-01-02T00:00:00+00:00 ((2457390j,0s,0n),...
dates = [
  "24/Oct/2014:13:43:15 -0600",
  "25/Oct/2014:14:47:25 -0600",
  "24/Oct/2014:13:46:15 -0600"
]

dates.map { |date| date.match(/\A[^:]+/).to_s }
dates.map { |date| date.partition(?:)[0] }
这两种方法都将返回一个字符串数组,如下所示:

#=> ["24/Oct/2014", "25/Oct/2014", "24/Oct/2014"]
考虑 将这样的日期作为字符串对象处理的主要问题是,您假设字符串表示形式总是相同的。如果你知道你的数据,那很好,但通常最好把日期当作日期。例如,您可以使用(带或不带)自动处理常见表示,如下所示:

require 'date'

# Remove #to_s if you want to return actual Date objects for
# further processing, rather than an array of strings.
dates.map { |date| Date.parse(date).to_s }
#=> ["2016-10-24", "2016-10-25", "2016-10-24"]

# This will only return strings, but that's what you originally
# asked for.
dates.map { |date| Date.parse(date).strftime '%d/%b/%Y' }
#=> ["24/Oct/2016", "25/Oct/2016", "24/Oct/2016"]
Date和DateTime库也包含其他解析器。当然,如果使用非标准输入格式,则可以与自定义模板一起使用

这里的要点是munging字符串对象可以工作,但通常最好将日期作为Date或DateTime对象处理,以避免边缘情况、验证输入以及引发异常,如:

dates.map { |date| Date.rfc2822 date }
ArgumentError:无效日期


在适当的时候。您应该尽可能充分利用这样的核心功能。

调用ruby数组
times
是一个好主意吗?它是一个times数组,但只要不与保留关键字冲突,您几乎可以任意调用它
times
不是其中之一。调用ruby数组
times
是个好主意吗?它是一个时间数组,但只要它不与保留关键字冲突,你几乎可以调用任何你想要的东西<代码>时间
不是其中之一。