Skip to content

Instantly share code, notes, and snippets.

@bastosmichael
Last active June 1, 2018 04:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bastosmichael/9a6ca3fc2c2fdd5abf1abf0a705ea51a to your computer and use it in GitHub Desktop.
Save bastosmichael/9a6ca3fc2c2fdd5abf1abf0a705ea51a to your computer and use it in GitHub Desktop.
Adding minutes in ruby without using Time Objects
def add_minutes(time, signed_integer_minutes)
if time_regex = time.match(/(\d{1,2}+):(\d{2}+) (AM|PM)/)
total_minutes = time_regex[2].to_i + (signed_integer_minutes.abs % 60)
final_minutes = total_minutes % 60
total_hours = time_regex[1].to_i + (signed_integer_minutes.abs / 60 % 60) + (total_minutes / 60 % 60)
final_modulo_hours = total_hours % 12
final_hours = final_modulo_hours.zero? ? 12 : final_modulo_hours
half_of_day = ['AM', 'PM']
final_half_of_day = half_of_day[(half_of_day.find_index(time_regex[3]) + (total_hours / 12 % 12)) % 2]
return "#{final_hours}:#{final_minutes.to_s.rjust(2,'0')} #{final_half_of_day}"
else
fail ArgumentError 'Date Format Error, please use [H]H:MM {AM|PM}'
end
end
require 'test/unit/assertions'
include Test::Unit::Assertions
assert_equal("12:33 PM", add_minutes("9:13 AM", 200))
assert_equal("2:13 PM", add_minutes("9:13 AM", 300))
assert_equal("3:53 PM", add_minutes("9:13 AM", 400))
assert_equal("5:33 PM", add_minutes("9:13 AM", 500))
assert_equal("7:13 PM", add_minutes("9:13 AM", 600))
assert_equal("8:53 PM", add_minutes("9:13 AM", 700))
assert_equal("10:33 PM", add_minutes("9:13 AM", 800))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment