6

我有来自第三方的时间串(多么诗意),有些有时区,而有些则没有。如果一个时区不存在,我想做的附加一个时区。

以下是带有时区的字符串示例...

5:21 AM MT
10:01 PM MT
8:41 PM MT

但有时MT无论出于何种原因,它都会丢失。

所以,我需要做的是在它丢失MT之后附加。AMPM

(注意,我不能只检查MT。它可以是任何时区。这里的主要目标是能够附加我在AM或之后选择的任何时区PM)。

4

7 回答 7

8

我不喜欢其中的任何一个,所以我决定chomp如果它存在就将其关闭,然后再次添加它。在你的情况下:

"#{time.chomp(' MT')} MT"

编辑:这实际上不适用于 OP 编辑​​的用例(许多不同的时区),但对原始用例和可能从 Google 找到它的人(比如我!)都很有用。

于 2017-02-17T11:19:41.677 回答
2

如果 AM/PM 指示器总是在那里,我可能会检查字符串的结尾是什么,然后在必要时附加:

if string.match(/\ (A|P)M$/)
  string << " #{timezone}"
end

如果不是(即:24 次),您最好通过 a DateorTime解析器解析字符串,并在将字符串转换为适当的对象后以这种方式附加时区。

于 2013-10-30T16:48:16.380 回答
2
>> s = 'foobar'

>> s.ends_with?('bar') ? s : "#{s}bar"

=> "foobar"

>> s = 'foo'

>> s.ends_with?('bar') ? s : "#{s}bar"

=> "foobar"
于 2016-08-26T23:55:19.963 回答
0

非正则表达式解决方案:

strings = ['5:21 AM MT', '8:41 PM MT',  '8:41 AM']
timezone = ' MT'
p strings.map{|time| time.end_with?('AM', 'PM') ? time+timezone : time}
#=> ["5:21 AM MT", "8:41 PM MT", "8:41 AM MT"]
于 2013-10-30T17:16:11.290 回答
0

借用我的 Perl 日子:

str = '5:21 AM MT'
str # => "5:21 AM MT"
str[/[AP]M$/] # => nil
str[/[AP]M$/] && str << ' MT'
str # => "5:21 AM MT"

str = '5:21 AM'
str # => "5:21 AM"
str[/[AP]M$/] # => "AM"
str[/[AP]M$/] && str << ' MT'
str # => "5:21 AM MT"

你问它是如何工作的?str[/[AP]M$/] && str << ' MT'是神奇的东西。查看str[/[AP]M$/]行的结果:

  • 如果字符串不以"AM"or结尾"PM",则nil返回,这在 Ruby 中为 false,导致&&条件短路。
  • 如果字符串以"AM"or结尾"PM",Ruby 返回匹配的字符串,如第二个示例所示,它触发&&(and) 和 appends ' MT'
于 2013-10-30T23:31:24.790 回答
-1
time_string.sub(/([AP]M){1}$/, '\1 MT')
于 2013-10-30T18:12:03.647 回答
-2

因此,如果字符串包含一个AMorPM后面不跟一个空格和一堆以 结尾的大写字母,请在or之后T追加?MTAMPM

timezone_string.sub(/( [AP]M)(?! [A-Z]+T)/,'\1 MT')
于 2013-10-30T16:48:45.587 回答