How do you set a default format for dates in a hash? [duplicate] - ruby

I am trying to return a date with this format
2015-10-07T00:32:50.877+0000
I have tested that
Time.now.iso8601
=> "2015-10-21T09:47:50-04:00"
but i didn't have same format
tks

You can use strftime yourself and create the format you want as described here
The format you specified should be %Y-%m-%dT%H:%M:%S.%L%z
And so the complete Ruby statement would be Time.now.strftime('%Y-%m-%dT%H:%M:%S.%L%z')
Various ISO 8601 formats:
%Y%m%d => 20071119 Calendar date (basic)
%F => 2007-11-19 Calendar date (extended)
%Y-%m => 2007-11 Calendar date, reduced accuracy, specific month
%Y => 2007 Calendar date, reduced accuracy, specific year
%C => 20 Calendar date, reduced accuracy, specific century
%Y%j => 2007323 Ordinal date (basic)
%Y-%j => 2007-323 Ordinal date (extended)
%GW%V%u => 2007W471 Week date (basic)
%G-W%V-%u => 2007-W47-1 Week date (extended)
%GW%V => 2007W47 Week date, reduced accuracy, specific week (basic)
%G-W%V => 2007-W47 Week date, reduced accuracy, specific week (extended)
%H%M%S => 083748 Local time (basic)
%T => 08:37:48 Local time (extended)
%H%M => 0837 Local time, reduced accuracy, specific minute (basic)
%H:%M => 08:37 Local time, reduced accuracy, specific minute (extended)
%H => 08 Local time, reduced accuracy, specific hour
%H%M%S,%L => 083748,000 Local time with decimal fraction, comma as decimal sign (basic)
%T,%L => 08:37:48,000 Local time with decimal fraction, comma as decimal sign (extended)
%H%M%S.%L => 083748.000 Local time with decimal fraction, full stop as decimal sign (basic)
%T.%L => 08:37:48.000 Local time with decimal fraction, full stop as decimal sign (extended)
%H%M%S%z => 083748-0600 Local time and the difference from UTC (basic)
%T%:z => 08:37:48-06:00 Local time and the difference from UTC (extended)
%Y%m%dT%H%M%S%z => 20071119T083748-0600 Date and time of day for calendar date (basic)
%FT%T%:z => 2007-11-19T08:37:48-06:00 Date and time of day for calendar date (extended)
%Y%jT%H%M%S%z => 2007323T083748-0600 Date and time of day for ordinal date (basic)
%Y-%jT%T%:z => 2007-323T08:37:48-06:00 Date and time of day for ordinal date (extended)
%GW%V%uT%H%M%S%z => 2007W471T083748-0600 Date and time of day for week date (basic)
%G-W%V-%uT%T%:z => 2007-W47-1T08:37:48-06:00 Date and time of day for week date (extended)
%Y%m%dT%H%M => 20071119T0837 Calendar date and local time (basic)
%FT%R => 2007-11-19T08:37 Calendar date and local time (extended)
%Y%jT%H%MZ => 2007323T0837Z Ordinal date and UTC of day (basic)
%Y-%jT%RZ => 2007-323T08:37Z Ordinal date and UTC of day (extended)
%GW%V%uT%H%M%z => 2007W471T0837-0600 Week date and local time and difference from UTC (basic)
%G-W%V-%uT%R%:z => 2007-W47-1T08:37-06:00 Week date and local time and difference from UTC (extended)

If you just want to include the fractional number of seconds, you can use DateTime#iso8601([n=0]) → string:
pry(main)> require 'date'
pry(main)> DateTime.now.iso8601(3)
=> "2017-01-17T12:31:26.695+11:00"
Or in Rails:
pry(main)> Time.now.iso8601(3)
=> "2017-01-17T12:31:26.695+11:00"

It seems like the main issue is that you want the output to be UTC encoded ISO 8601 timestamp, while Ruby by default uses the timezone of the Time value - which is most likely, especially if you create the value using Time.now, your local time zone.
The solution would be to convert the Time value to a UTC timezone using #utc method:
now = Time.now
# convert to UTC and format
puts now.utc.iso8601
This would output 2020-04-20T20:46:31Z - the Z there is equivalent to +00:00 and means UTC (or "Zulu time" in US military jargon). Any ISO-8601 compliant implementation should accept Z being identical to +00:00.
Note:
The iso8601 method on the Time instance is an extension. It is part of the standard library, but you have to load it explicitly using require 'time'. This also loads other useful extensions for the Time class.

Did you try with Date?
Date.new(2018,5,25).iso8601 # returns "2018-05-25"
For today, it would be:
Date.today.iso8601

For a UTC time in ISO 8601:
require 'date'
DateTime.now.new_offset(0).iso8601
# => "2022-04-15T16:33:17+00:00"
(This works even outside of Rails.)

Related

Adding custom time to date

the timestamp is in a format that I am not able to add to the ruby date. How can I do this?
sd=Date.parse('2016-01-01')
z="4:00am"
How do I add z into sd?
You can't add time to date but you can parse time like this (just concatenate date and time)
date = '2016-01-01'
time = '4:00am'
require 'time'
Time.parse("#{date} #{time}")
# => 2016-01-01 04:00:00 +0300
To avoid some parsing misinterpretation you can explicitly point directives
DateTime.strptime("#{date} #{time}", '%Y-%m-%d %H:%M%p')

country time in laravel system

I work on a course system that has course times I want when the site is opened in a country, the time of the course appears for the user in the real time of the country in which the user is located
To convert user time to UTC use following laravel code in your controller method
# convert user date provided date string to user date
$user_date = date('Y-m-d H:i:s', strtotime($date_string));
# convert user date to utc date
$utc_date = Carbon::createFromFormat('Y-m-d H:i', $user_date, $user->timezone);
$utc_date->setTimezone('UTC');
# check the utc date
dd($utc_date);
Convert UTC time to User time
# using utc date convert date to user date
$user_date = Carbon::createFromFormat('Y-m-d H:i', $utc_date, 'UTC');
$user_date->setTimezone($user->timezone);
# check the user date
dd($user_date);

Ruby on Rails 3 convert time to DateTime in specific timezone

I have column which stores only time. I want to convert to it into datetime and then to a specific timezone. When I do it on console using only the attribute, it shows correct conversion value. But when I use it in query the query shows the current time in UTC. Suppose I have time "05:15" stored in Central time. Now when I want to fetch records for a interval of 30 minutes plus and minus of this time, I do following,
day = Time.now
# departure_time_from _db below is the name of column in table which store time
departure = departure_time_from _db.change(:day => date.day, :month => date.month, :year => date.year)
departure = departure.in_time_zone("Central Time (US & Canada)")
When I execute above code on console and see the value, it shows correct converted value. But when I use this variable in below query, current time gets used instead of the departure time.
Model.where("column_name > ? and "column_name < ?, departure - 30.minutes, departure + 30.minutes)
The time used in above query should be the time I want i.e Central time zone, but in query output, it shows UTC being used.
Please let me know what i am missing.
It shouldn't matter what time zone the query uses in the where clause as long as it's the same time representation. The time you're seeing in your query output from Rails is most likely the UTC equivalent of the ruby DateTime object being passed to the where statement. So if departure is 12:00 noon (UTC -6) in your Ruby code then the time shown in the SQL query will be 18:00, which corresponds to noon CST.

Given a Ruby DateTime how can I determine if it represents a day in the current work week?

I have a Ruby DateTime instance and I would like to know it is within the current week (Monday-Sunday). I'm not using Rails.
My guess is that I'd need to get the dates of Monday and Sunday for the current week and test whether my date lies between them.
Date.parse("Monday") # get the Monday date of current week
=> #<Date: 2015-10-26 ((2457322j,0s,0n),+0s,2299161j)>
Date.today.between?(Date.parse("Monday"), Date.parse("Monday") + 7)
=> true
DateTime.now.between?(Date.parse("Monday"),Date.parse("Monday") + 7)
=> true

How can I compare a date field with date.today and display the differance?

I have a table of accounts, each with an expiration date. The expiration date is saved in a date field (day, month and year).
How can I compare this to the current date and display the number of days until the expiration date is reached?
Thanks for any help it's much appreciated!
simple (Date.today - account.expiration_date).to_i will give you the integer number - the difference in days :)
You can convert your components into a target date and use some of the methods in DateHelper to display a human readable distance:
target_date = Date.new(model.year, model.month, model.day)
distance_of_time_in_words(target_date, Date.today)
=> "4 months"

Resources