gpt4 book ai didi

ruby-on-rails - 将基于时间的字符串转换为 ISO 格式

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:15 26 4
gpt4 key购买 nike

我有一个 Song具有按分钟和秒计算的持续时间属性(基于字符串)的对象。我想将其输出为 datetime <time/> 的属性标签(通过 Rails),但需要将其转换为 ISO 8601 格式以使其在语义上有效。

所以,我有持续时间,"2:30" .字符'PT'在删除两个数字之间的冒号并最后附加字母 'S' 时需要添加前缀最后:

PT2M30S

最终输出:

<time itemprop="duration" datetime="PT2M30S">2:30</time>

我将如何着手实现这一目标?

是否已经有 Ruby 方法可以完成此任务?是否必须写出正则表达式才能查找/替换上述字符?

最佳答案

这不需要正则表达式或任何花哨的东西。我只是在冒号处拆分,然后将结果传递到格式字符串中:

'PT%sM%sS' % "2:30".split(':') # => "PT2M30S"

How does the modulo operator work in this case? Never seen something done like this before.

除非应用于数字,否则它不是“模运算符”。它是一个名为 % 的字符串方法,相当于 formatsprintf。参见 String.%其次是 Kernel::sprintf了解更多信息,但基本上:

  s   | Argument is a string to be substituted.  If the format
| sequence contains a precision, at most that many characters
| will be copied.

所以:

'%s'   % 'foo' # => "foo"
'%5s' % 'foo' # => " foo"
'%-5s' % 'foo' # => "foo "
'%1s' % 'foo' # => "foo"
'%.1s' % 'foo' # => "f"

'%s = %s' % ['a', 1] # => "a = 1"

特别要注意的是,在最后一个 1 中,插入字符串时会转换为 "1"。这可能很有用,但不是从对象转换为字符串的唯一方法(甚至不是更好的方法)。


最后,不要假设正则表达式是解决所有需要从字符串中提取信息的问题的方法。如果您可以在不诉诸奇怪的解决方法的情况下做到这一点,请使用内置方法,例如 split:

require 'fruity'

compare do
_split { 'PT%sM%sS' % "2:30".split(':') }
_regex { "2:30".sub(/(.*):(.*)/, "PT\\1M\\2S") }
end

结果是:

# >> Running each test 2048 times. Test will take about 1 second.
# >> _split is faster than _regex by 19.999999999999996% ± 10.0%

正则表达式很灵活,但通常是以速度变慢为代价的。

另外,我们看到很多误用 gsub 的地方,而实际上应该使用 subsubgsub 做的工作少很多; sub 触发一次,gsub 将继续循环,直到它到达字符串的末尾。这是一个可衡量的差异,即使是在像 "2:30" 这样的短字符串上也是如此:

compare do
_sub { "2:30".sub(/(.*):(.*)/, "PT\\1M\\2S") }
_gsub { "2:30".gsub(/(.*):(.*)/, "PT\\1M\\2S") }
end

# >> Running each test 2048 times. Test will take about 1 second.
# >> _sub is faster than _gsub by 2x ± 0.1

关于ruby-on-rails - 将基于时间的字符串转换为 ISO 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32570062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com