Time display format problem - ruby-on-rails

My object model has a attribute named "start_at" which is sotred in PostgreSQL database.
Inside the database table, the type of "start_at" is "time without time zone" and one object start_at value is e.g. 10:20:00.
However, when I render this time value to my index.html.haml view by using
%td =myobj.start_at, the view page always show "Sat Jan 01 10:20:00 UTC 2000" instead of 10:20:00.
How to get rid of it to show only 10:20:00 instead of the long string?

What about:
myobj.start_at.strftime('%H:%M:%S')
Check resource here: http://www.ruby-doc.org/core/classes/Time.html#M000392

use timeobj.strftime("%H:%M:%S")
you can view all the options for strftime here

Related

Convert time zone of datetime returned by f.datetime_select

When I use f.datetime_select in a rails form, it returns a datetime to my controller in UTC, e.g.
2014-06-18T11:00:00+00:00
My local time zone is set to Melbourne (+10) as specified in my application.rb file:
config.time_zone = 'Melbourne'
So when I retrieve datatimes from my database they are automatically converted to Melbourne (+10) timezone, e.g.
2014-06-17 19:00:00 +1000
I want to compare the datetime returned by f.datetime_select with a field in my database. How can I do this?
i.e. how can i change the time zone of the datetime returned by f.datetime select to 'Melbourne' (+10) without changing the actual time? i.e. convert:
2014-06-18T11:00:00+00:00
to
2014-06-18T11:00:00+10:00
All dates stored in database are in UTC time. So when your app get new date from 'params' you basically have 2 options: to save it to the ActiveRecord model, and during that AR will perform all heavylifting of deciding of what timezone was meant.
If you don't want to save data to the model, you have to deal with it yourself. Date select control return just 3 specially formatted strings in params hash.
Let's say I named field in my form 'birthdate'. Controller will get something like:
"<your_model_name>" => {... , "birthdate(3i)" => "<day>", "birthdate(2i)" => "<month>", "birthdate(1i)" => "<year>", ...}
So you could deal with that info something like:
Time.zone.parse("#{ params[:model]['birthdate(3i)'] }-#{ params[:model]['birthdate(2i)'] }-#{ params[:model]['birthdate(1i)'] }")
And yeah I know that it looks ugly, and after some research I surprised that there is no any 'out of the box' solution )

Displaying invalid attribute before type cast

I have a model with date attribute. I built a custom validation using [attribute]_before_type_cast so that a date like '31.02.2013' make validation failing.
The problem is that:
#invoice.order_date = '31.02.2013'
#invoice.order_date #=> Sun Mar 03 00:00:00 +0100 2013
So on the view layer user gets message about invalid date but the invalid attribute is automatically changed to 03.03.2013 which is infact a proper date so it is kind of non-sense.
Is there a way to stop that type_cast and display that attribute with invalid date?
I think you can create a custom setter method to prevent the changing of the attribute.
def order_date=(date)
date = your_validate_and_format_method(date)
self.send(:write_attribute, :order_date, date)
end
In the your_validate_and_format_method you can do something like validate, format and you can determine to keep the old value or use the new one.

Rails - Don't want timezone in sql o/p

I have a Rails app on PGSQL and there is a Date of Birth column (timestamp without time zone).
I use a "select" to get the employee data back and return that as JSON, but the DOB always comes back with a timezone, e.g. "dob":"1992-06-18T20:00:00-04:00".
I tried using to_char(emp.dob, 'YYYY-MM-DD HH24:MI:SS'), but no effect.
Any one has any ideas how to get the o/p to not contain TZ information?
Something like: 1992-06-18 20:00:00
Thanks
EDIT: Found the solution to a similar question here:
rails dates with json
Use the localization method and type the following:
<%= l emp.dob, :format => :long %>
There are several pre-defined options to show the text (:long, :short etc)
You can read more here.

Saving a Rails Record with a specific Timezone

How to save an event in Berlin with its own specific timezone and the next event in Tijuana with a different one?
The user is asked to choose a City for the event, as a source for e.g. +02:00.
I would like to receive a time code like this:
eventstart = "2011-07-22T18:00:00+02:00"
How would you go about creating that form?
UPDATE:
Realized saving as standard UTC is fine for many reasons. So now I am altering a time string in the view to present a *distance_to_time_in_words* for eventstart, depending on the user's local time.
Event in Tijuana, viewing from Berlin time:
old_zone = Time.zone
#=> "Berlin"
Time.zone = "Tijuana"
t = Time.zone.parse(eventstart.to_s[0..-7])
#=> 2011-07-22 18:00:00 +08:00
Time.zone = old_zone
#=> "Berlin"
distance_of_time_in_words(Time.now.in_time_zone, t)
#=> "9 hours"
cumbersome, but works for now. Improvement ideas welcome!
Add a time_zone column to your database and use time_zone_select in your form to let user select the time_zone for which he is creating event.
And in the model you can convert the datetime to zone specific datetime and store utc in the database. You can use helper something like below
def local_time(date)
Time.use_zone(self.time_zone) do
Time.zone.at(date.to_i)
end
end

How convert a string into a ActiveSupport::TimeWithZone?

I need to update a field (called updated_at). The field in MySQL is of type datetime, and the class is ActiveSupport::TimeWithZone. But the dates are strings like "10/17/2008". I used "10/17/2008".to_date (And I intend .to_time and .to_datetime), and even if in console the ActiveRecord class save successfully, the field in the database still is the current date.
OK.. let's take them one at the time.
First, it is not recommended to set a field name updated_at, since this is a "magic" field that is automatically populated by Rails.
If you want to disable this functionality, you may:
class Foo < ActiveRecord::Base
self.record_timestamps = false
end
in your class, but this will also disable created_at fields.
The best option is to add a new field (e.g. my_updated_at) as date in the database, and then Rails will automatically handle conversions, meaning that the next snippet will work:
Foo.new({:my_updated_at => "10/17/2008"})
Second, the answer on how to parse a string to ActiveSupport::TimeWithZone is:
ActiveSupport::TimeZone['UTC'].parse("10/17/2008")
but I don't think this will help you (of course, change UTC with your current date/time).
Simply
date_as_string = "2008-10-17"
ActiveSupport::TimeZone['UTC'].parse(date_as_string)
# => Fri, 17 Oct 2008 00:00:00 UTC +00:00
And just to confirm that it worked..
ActiveSupport::TimeZone['UTC'].parse(date_as_string).class
# => ActiveSupport::TimeWithZone

Resources