Change default Ruby Time format - ruby-on-rails

I keep having to append ".strftime("%H:%M")" to anything that is displaying a time in my Rails project. I have a start time and an end time for each Concert object, so I have to append ".strftime("%H:%M")" whenever I wanna display those times.
Note that I'm not asking to change the date format. The date looks fine as it is (as MM/DD/YYYY).
What's the best way to get around this? Is there a way to set the default time format?
(I'm pretty sure this is only a Ruby thing, but I'm a newbie, so I'm not sure.)

Since you're using Rails, take advantage of the I18n support: http://guides.rubyonrails.org/i18n.html#adding-date-time-formats
# config/locales/en.yml
en:
time:
formats:
default: "%H:%M"
Then when you call I18n.l Time.now or <%= l Time.now %>, it'll use that format automatically.

Ruby on Rails has built-in presets for formatting Date and Time instances. Here's what they are for Time on my machine:
>> Time::DATE_FORMATS
=> {:short=>"%d %b %H:%M", :db=>"%Y-%m-%d %H:%M:%S", :rfc822=>#<Proc:0x0000000103700b08#/Users/donovan/.gem/gems/activesupport-3.0.1/lib/active_support/core_ext/time/conversions.rb:13>, :time=>"%H:%M", :number=>"%Y%m%d%H%M%S", :long_ordinal=>#<Proc:0x0000000103700e50#/Users/donovan/.gem/gems/activesupport-3.0.1/lib/active_support/core_ext/time/conversions.rb:12>, :long=>"%B %d, %Y %H:%M"}
You can easily use them like so:
>> Time.now.to_s(:db)
=> "2011-01-12 15:26:11"
You can define your own and use it, too:
>> Time::DATE_FORMATS[:mine] = "%H:%M"
=> "%H:%M"
>> Time.now.to_s(:mine)
=> "15:28"

You could create a custom function in your application_helper.rb file. Maybe something like:
def custom_time(date)
date.strftime("%H:%M")
end
Not sure if this is best practice but it should work well.

I use an initializer: config/initializers/time_formats.rb which contains:
[Time, Date].map do |klass|
klass::DATE_FORMATS[:app_date] = "%m/%d/%Y"
klass::DATE_FORMATS[:app_month_and_year] = "%B %Y"
klass::DATE_FORMATS[:app_abbrev_month_and_year] = "%b %Y"
...
end
Then I use Time.now.to_s(:app_date), etc based on how I want to display it.
You could add Time::DATE_FORMATS[:default] = "%H:%M" to accomplish what you're trying to do. This is not internationalized though - for that, coreyward's answer is probably better.

Related

Rails 4 ERB: consistent date format

I have read several posts such as How to format time and date from db:datetime record in Rails 4? and Custom date time format in rails 4 and I feel like I am missing a puzzle piece.
In our project we have setup a conf variable for a date format and we use:
my_date_field.strftime(Rails.configuration.date_format_default)
Other suggestions are to setup an initializer and use:
my_date_field.to_s(format: :date_format_default)
Is there any way to make the output of a datetime field default to a format? In our project, unless we specify, we want a date to ALWAYS render the same way and it feels very un-DRY to have to constantly repeat strftime or to_s, both with their own parameters...
Set a default format in your translations:
en:
time:
formats:
default: "%a %b %d, %Y at %I:%M %p"
Then use the translation helper in your ERb templates:
l some_model.created_at
You can use I18n (Rails Internationalization) to set a default date and time format
config/locales/en.yml
en:
date:
formats:
default: "%d/%m/%Y"
time:
formats:
default: "%d/%m/%Y %H:%M"

How to convert date in format 09-feb-73 to 02/09/1973 (mm/dd/yyyy) using Ruby on Rails

How to convert date in format 09-feb-73 to 02/09/1973 (mm/dd/yyyy) using Ruby on Rails?
Valid Ruby datetime formats
Date.strptime("09-feb-73", "%d-%b-%y").strftime("%m/%d/%Y")
Note that strptime is a part of Rails. And these are the relevant formats used:
%b - The abbreviated month name (``Jan'')
%d - Day of the month (01..31)
%m - Month of the year (01..12)
%y - Year without a century (00..99)
%Y - Year with century
You can do it with Date.parse and Date#strftime:
d = Date.parse('09-feb-73').strftime('%m/%d/%Y')
# "02/09/1973"
You could also use Date.strptime instead of Date.parse:
d = Date.strptime('09-feb-73', '%d-%b-%y').strftime('%m/%d/%Y')
# "02/09/1973"
The advantage of strptime is that you can specify the format rather than leaving it to parse to guess.
Date.strptime("09-feb-73", "%d-%b-%y").strftime("%m/%d/%Y")
Date Formats: http://snippets.dzone.com/posts/show/2255
If you require this in a view, I would suggest using localizations, since you can easily change the behavior based on your user's local settings and keep your controller code tidy (why should the controller care about the date format?). Example:
# config/locales/en.yml
en:
time:
formats:
short: "%m/%d/%Y"
# view file
<%=l Time.now, :format => :short %>
For more information on rails localizations, see the Rails Guide.

Rails 3 default datetime format without UTC

I'm creating a new Rails 3 app, and in it I use DateTime for a couple of fields, however every datetime field standard has UTC behind it (in a view), like:
2010-10-10 16:19:00 UTC
How do I get rid of the UTC part?
UPDATE: here's what I have so far:
<%= trip.truckleft.strftime("%Y-%m-%d %H:%M") %>
So all I have to do now is put that in a helper, but isn't there a better more universal way?
I looked at some other posts, that suggested creating a time_formats.rb in initializers, however I didn't have any success doing that.
Thanks for your help, much appreciated!
Another -- perhaps now preferred -- way is to use Rails' internationalization and localization support. There's a lot to learn in that guide, so the tl;dr version is this:
<%= l trip.truckleft, :format => :long %>
There are a few predefined date and time formats like :long available to you already for English, and you can add your own in config/locales/en.yml by following the YAML structure in those examples. If you're not getting heavily into the whole i18n/l10n thing just yet and looking at the l method all the time is confusing, you can also use:
<%= trip.truckleft.to_formatted_s(:long) %>
Here is what finally worked for me:
I created a new file in:
config/initializers/
named: time_formats.rb
and added this to that file:
Time::DATE_FORMATS[:default] = "%Y-%m-%d %H:%M"
Then I saved, restarted the server and it started to work.
I'm using i18n to format my dates and have this in en.yml:
date:
formats:
default: "%m/%d/%Y"
I wanted to reuse that format for how the models show their dates, so my config/initializers/time_formats.rb contains this:
Date::DATE_FORMATS[:default] = lambda { |date| I18n.l(date) }
To be exact, you should put these in your initializers:
Date::DATE_FORMATS[:default] = "%m-%d-%Y"
Time::DATE_FORMATS[:default] = "%m-%d-%Y %H:%M"
When having datetime, the second one will work (for example: created_at for in models).
You can put the following line at the end of your config/environment.rb file:
Date::DATE_FORMATS[:default] = "%Y-%m-%d %H:%M"
for rails 3
add to config/environment.rb
my_datetime_formats = { :default => '%F %T' } #or any other you like
my_date_formats = { :default => '%F' } #or any other you like
Time::DATE_FORMATS.merge!(my_datetime_formats)
Date::DATE_FORMATS.merge!(my_date_formats)
(the difference from other answers - is merge! method)

Rails date format in form field

I'd like my dates in the mm/dd/year format in text fields. However, they currently displays as 2010-03-26.
Is there a global setting I can set to change this?
I tried the following, which seems to update the .to_s method, but form fields stay the same.
ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(:default => '%m/%d/%Y')
Thanks
You have to register the default format in an initializer.
Add this line to the config/initializers/date_time_formats.rb.
Date::DATE_FORMATS[:default] = '%m/%d/%Y'
# if you want to change the format of Time display then add the line below
Time::DATE_FORMATS[:default]= '%m/%d/%Y %H:%M:%S'
# if you want to change the DB date format.
Time::DATE_FORMATS[:db]= '%m/%d/%Y %H:%M:%S'
Now in the script\console lets test the format.
>> Date.today.to_s
=> "03/14/2010"
>> Time.now.to_s
=> "03/14/2010 13:20:55"
I don't know if there is a global setting for that anywhere, I just do it in the ERB.
<%= text_field_tag("air_date_date", air_date.blank? ? "" : air_date.strftime("%m/%d/%Y"), :class => "date-input text") %>
Alternatively, you can factor this out into a helper function to make it DRY.
I know this is an awfully old question, but you could use date_field instead of text_field. Perhaps that wasn't an option when you asked this question originally.
It displays the date in mm/dd/yyyy, which is your intent.
<%= date_field :column_name %>
The date_select form helper provides a "bare bones" date selector.

Formatting timestamps

How do you format Rails timestamps in a more human-readable format? If I simply print out created_at or updated_at in my view like this:
<% #created = scenario.created_at %>
Then I will get:
2009-03-27 23:53:38 UTC
The strftime (from Ruby's Time) and to_formatted_s (from Rails' ActiveSupport) functions should be able to handle all of your time-formatting needs.
Take a look at the I18n functionality. It allows you to do the following in your views:
<%= localize(scenario.created_at, :format => :long) %>
where the formats are defined in your locales.
More info
Also
<%= l scenario.created_at, :format => :sample) %>
And in locales/en.yml(depending of language)
en:
time:
formats:
sample: '%d.%m.%Y'
To learn more, see - http://guides.rubyonrails.org/i18n.html
Time.now().to_i works great. For reverse conversion use Time.at(argument)
You can use strftime to format the timestamp in many ways. I prefer some_data[:created_at].strftime('%F %T'). %F shows "2017-02-08" (Calendar date extended), and %T shows "08:37:48" (Local time extended).
For timezone issues, add this lines to your config/application.rb file
config.time_zone = 'your_timezone_string'
config.active_record.default_timezone = :local
See below for 1.Make a timestamp and 2.Format a timestamp
1.Make a timestamp
This line code in Ruby Time.now.getutc returns a UTC time stamp e.g. 2022-07-05 15:20:40.976321 UTC.
2.Format a timestamp
You can then format it with strftime. The 2 lines of code:
timestamp_UTC=Time.now.getutc
timestamp_UTC_formated=timestamp_UTC.strftime("%Y%m%d_%Hh%Mm%Ss")
return a timestamp formated, e.g. "20220705_15h23m24s".
See strftime documentation for the formatting syntax.
you have to modify the timestamp file, in my case this file is located in /usr/local/rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.2.0/lib/active_record/timestamp.rb. You must search for this line:
self.class.default_timezone == :utc ? Time.now.utc : Time.now
and change it to this:
self.class.default_timezone == :utc ? Time.now.utc : Time.now.strftime('%Y-%m-%d %H-%M-%S')
The trick is to modify the format with the strftime method, you can change the format if you want.
Now rails will use your format to update the "updated_at" column.

Resources