LearningRoR
LearningRoR

Reputation: 27242

How to parse time field into hours, minutes and seconds?

How would I parse my start_at column to be three different fields for hours, minutes and seconds instead of just one?

Note: I want to keep it as one column and not make three different ones.

Here is my code:

Table:

class CreateTimers < ActiveRecord::Migration
  def change
    create_table :timers do |t|
      t.time :start_at

      t.timestamps
    end
  end
end

Form:

<%= form_for(@timer) do |f| %>

  <div class="form-inputs">
    <%= f.text_field :start_at %>
  </div>

  <div class="form-actions">
    <%= f.submit 'Start', :class => 'btn-primary span3' %>
  </div>
<% end %>

Upvotes: 2

Views: 3631

Answers (5)

the Tin Man
the Tin Man

Reputation: 160631

You don't say what format your time values are in. Because users love to be different, if you give them a free-form text field, odds are really good you'll get data in varying formats, so you'll have to be flexible.

You can try using DateTime's parse method, which provides some flexibility for the formats.

DateTime.parse('2001-02-03T04:05:06+07:00')
#=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>

DateTime.parse('20010203T040506+0700')
#=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>

DateTime.parse('3rd Feb 2001 04:05:06 PM')
#=> #<DateTime: 2001-02-03T16:05:06+00:00 ...>

There's also the Chronic gem, which allows even more flexibility in how the values can be entered.

Once you have a DateTime or Time value, you can use that object's methods to get at the hour, minute and second fields:

now = Time.now # => 2012-10-03 07:50:26 -0700
now.hour       # => 7
now.min        # => 50
now.sec        # => 26

or:

require 'date'
now = DateTime.now # => #<DateTime: 2012-10-03T07:52:53-07:00 ((2456204j,53573s,622304000n),-25200s,2299161j)>
now.hour # => 7
now.min  # => 52
now.sec  # => 53

Upvotes: 2

Bhushan Lodha
Bhushan Lodha

Reputation: 6862

start_at.strftime("%H %M %S")

More detailed documentation is at: http://www.ruby-doc.org/core-1.9.3/Time.html

Upvotes: 1

abhas
abhas

Reputation: 5213

For e.g.

start_at - 2011-04-26 04:14:56 UTC

For hours:

start_at.strftime("%H") = "04" 

For minutes:

start_at.strftime("%M") = "14"

For seconds:

start_at.strftime("%S") = "26"

Upvotes: 1

Mikhail Nikalyukin
Mikhail Nikalyukin

Reputation: 11967

If you just want to split time to three separate inputs you can use the time_select helper.

Otherwise use the strftime method; Check http://strfti.me for more help.

Upvotes: 3

Prasad Surase
Prasad Surase

Reputation: 6574

Check out strftime at http://www.ruby-doc.org/core-1.9.3/Time.html

Upvotes: 1

Related Questions