Skip to main content

iso8601_duration_handling

🔍 Parsing and Applying ISO8601 Durations with the iso8601 Gem

Ruby doesn’t support ISO8601 durations out of the box. The iso8601 gem lets you parse PnYnMnDTnHnMnS strings and convert them to seconds or directly apply them to a Time or DateTime.

# Add to your Gemfile:
# gem 'iso8601'
require 'iso8601'
require 'date'

duration = ISO8601::Duration.new('P1Y2M10DT2H30M')
start_dt = DateTime.parse('2022-01-01T00:00:00Z')
# Compute end datetime
end_dt = start_dt >> (duration.years * 12 + duration.months)
end_dt = end_dt + Rational(duration.days, 1)
end_dt = end_dt + Rational(duration.hours * 3600 + duration.minutes * 60 + duration.seconds, 86_400)

puts end_dt.iso8601
# => "2023-03-11T02:30:00+00:00"