You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ruby中解析P0DT22H10M0S这类特殊时长格式?

嘿,这个问题我刚好熟!咱们一个个说清楚:

格式名称

你提到的P0DT22H10M0S是ISO 8601 持续时间格式,它是国际标准化组织制定的时间间隔表示规范,各个部分的含义很清晰:

  • P:是Period(周期)的标识,必须放在格式开头
  • 0D:代表0天(D=Day)
  • T:是时间部分的分隔符,后面跟着时分秒相关的内容
  • 22H:代表22小时(H=Hour)
  • 10M:代表10分钟(M=Minute)
  • 0S:代表0秒(S=Second)
Ruby中的处理方案

1. 借助Rails的ActiveSupport(内置方案)

如果你是在Rails项目里,那ActiveSupport已经帮你搞定了,直接用ActiveSupport::Duration.parse就能解析:

require 'active_support/duration'

# 解析目标格式
duration = ActiveSupport::Duration.parse("P0DT22H10M0S")

# 可以单独获取各时间单位的值
duration.hours  # 返回 22
duration.minutes # 返回 10

# 也可以转换成总秒数
duration.to_i # 返回 79800

2. 原生Ruby(无框架依赖)

原生Ruby标准库没有专门的内置方法,但你可以用正则表达式快速实现一个解析逻辑,比如:

def parse_iso8601_duration(duration_str)
  # 匹配格式中的各个时间部分
  match_result = duration_str.match(/P(?:(\d+)D)?T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?/)
  
  # 提取各部分数值,默认0
  days = match_result[1]&.to_i || 0
  hours = match_result[2]&.to_i || 0
  minutes = match_result[3]&.to_i || 0
  seconds = match_result[4]&.to_i || 0

  # 计算总秒数并返回结构化结果
  total_seconds = days * 86400 + hours * 3600 + minutes * 60 + seconds
  { days: days, hours: hours, minutes: minutes, seconds: seconds, total_seconds: total_seconds }
end

# 调用示例
result = parse_iso8601_duration("P0DT22H10M0S")
# 返回 {:days=>0, :hours=>22, :minutes=>10, :seconds=>0, :total_seconds=>79800}

3. 第三方Gem(健壮性更高)

如果不想自己写代码,或者需要处理更复杂的ISO 8601格式(比如带小数的时长,如P0DT22H10M5.5S),可以用成熟的第三方gem iso8601:

  • 先安装:gem install iso8601
  • 使用示例:
require 'iso8601'

duration = ISO8601::Duration.new("P0DT22H10M0S")
duration.to_seconds # 返回 79800.0
duration.hours      # 返回 22
duration.minutes    # 返回 10

内容的提问来源于stack exchange,提问作者Strongelhold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:18:59