Time manipulation in ruby

后端 未结 5 728
北荒
北荒 2021-02-05 02:49

I want to create a DateTime instance that lies 20 minutes and 10 seconds in the future. I tried around with Time and DateTime in irb, but can\'t seem to figure out a way that re

相关标签:
5条回答
  • 2021-02-05 03:17

    Just use the Active Support Time extensions. They are very convenient and less error prone than trying to do this by hand. You can import just the module you need:

    # gem 'activesupport'
    require 'active_support/core_ext/numeric/time.rb'
    DateTime.now + 20.minutes
    

    N.B: Yes, this goes against the StackOverflow party line of staying away from 3rd party libraries, but you shouldn't avoid using libraries when they are practically standard, reduce your risk significantly, and provide better code clarity.

    0 讨论(0)
  • 2021-02-05 03:30

    Assuming you have required Active Support or you're working in a Rails project. A very simple and readable way to do this in Ruby is:

    DateTime + 5.minutes
    Time + 5.minutes
    

    Also works with seconds, hours, days, weeks, months, years.

    0 讨论(0)
  • 2021-02-05 03:35

    As noted above, you can add seconds to a Time object, so if you call to_time on a DateTime object, you can add seconds to it:

    DateTime.strptime("11/19/2019 18:50","%m/%d/%Y %H:%M") + 1 => adds a day
    
    (DateTime.strptime("11/19/2019 18:50","%m/%d/%Y %H:%M").to_time) +1 => adds a second
    

    This doesn't require adding gems.

    0 讨论(0)
  • 2021-02-05 03:37

    Pure Ruby (no Rails)

    class Numeric
      def minutes; self/1440.0 end
      alias :minute :minutes
    
      def seconds; self/86400.0 end
      alias :second :seconds
    end
    

    Where 1440 is the number of minutes and 86400 is the number of seconds in a day. Based on how Rails does.

    Then you can just let the magic happen:

    d + 20.minutes + 10.seconds
    

    Source: https://github.com/rails/rails/blob/v6.0.3.1/activesupport/lib/active_support/core_ext/numeric/time.rb

    0 讨论(0)
  • 2021-02-05 03:38

    A Time is a number of seconds since an epoch whereas a DateTime is a number of days since an epoch which is why adding 1 to a DateTime adds a whole day. You can however add fractions of a day, for example

    d = DateTime.now
    d + Rational(10, 86400)
    

    Will add 10 seconds to d (since there are 86400 seconds in a day).

    If you are using Rails, Active Support adds some helper methods and you can do

    d + 20.minutes + 10.seconds
    

    Which will do the right thing is d is a DateTime or a Time. You can use Active Support on its own, and these days you can pull in just the bits you need. I seem to recall that this stuff is in activesupport/duration. I believe there are a few other gems that offer help with time handling too.

    0 讨论(0)
提交回复
热议问题