Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
I think you're trying to trick us.
The input date to your question is the
25th of October, 2010
, whilst the output is the
29th
of October, 2010
. Well played!
Continuing on this nit-picking thread: your times are also completely different and you're missing the seconds from the output time.
Now for the true answer.
A little factoid first though: the ISO 8601 output in Ruby is similar to the "Combined date and time" output from
ISO 8601's Wikipedia page
.
You've got a string and so you'll need to convert it into a
Time
object which you can do with
to_time
. Then it's simply a matter of calling
iso8601
on that object to get the ISO 8601 version:
"2010-10-25 23:48:46 UTC".to_time.iso8601
The to_time method is courtesy of Rails, whilst the iso8601 is courtesy of Ruby's standard library.
–
–
–
–
After much experimenting, I find the Time library's parser to be better than DateTime, although the reasons escape me at the moment. With that caveat, I always use Time rather than DateTime for this kind of stuff, and the ruby documentation is also difficult to grok as to why this is so,
require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"
–
Note: you have to convert (parse) a time string into a time object before you can apply the to_time method.
ruby-1.9.2-p180 :016 > "2010-10-25 23:48:46 UTC".to_time.iso8601
NoMethodError: undefined method `to_time' for "2010-10-25 23:48:46 UTC":String
from (irb):16
Correct procedure:
irb> ut = DateTime.parse("2010-10-25 23:48:46 UTC")
irb> ut.iso8601
=> "2010-10-25T23:48:46+00:00"
Adding an answer to this super old question because if you're using Rails, there is no need to convert/parse it in the way the other answers here are telling you to do:
If it's already a timestamp (e.g., a created_at or updated_at attribute), you can directly call the iso8601 method on that timestamp (e.g., object.created_at.iso8601).
The iso8601 method also accepts a numeric argument to display fractional digits; you would use this if you want 2020-04-06T19:16:55.604Z instead of 2020-04-06T19:16:55Z.
https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.