I'm trying to parse a specific hour of a specific date. When I put the date directly as an argument, it works fine, but when I create a variable and put it in the argument it returns the current date.
Why is that?
NOTE: the variable time is 9pm and I need to parse 9pm of 12 March 2016.
datetime = DateTime.new(2016,3,12,9)
=> Sat, 12 Mar 2016 09:00:00 +0000
DateTime.parse("sat 12 march 2016 9pm")
=> Sat, 12 Mar 2016 21:00:00 +0000
DateTime.parse("datetime 9pm")
=> Mon, 14 Mar 2016 21:00:00 +0000
In your third call, you use the literal string "datetime" rather than the value of your datetime variable. You can use string interpolation to use the variable's value:
DateTime.parse("#{datetime} 9pm")
In this case, the "9pm" is ignored since it doesn't make sense added to the end of an existing date but this is why the initial attempt wasn't working. Interpolation is generally a solution for using a variable's value rather than its name.
If your goal is to change the time of an existing date, use the change method:
datetime.change(hour:21)
You can also try this
date = Date.new(2016,3,12)
DateTime.parse("#{date} 9pm")
## Output
Sat, 12 Mar 2016 21:00:00 +0000
OR
datetime = DateTime.new(2016,3,12,9)
DateTime.parse((datetime + 12.hours).to_s)
## Output
Sat, 12 Mar 2016 21:00:00 +0000
OR
DateTime.parse((datetime + 12.hours).to_s).strftime("%a, %d %b %Y %I:%M %p")
## Output
Sat, 12 Mar 2016 09:00 PM
Related
I'm trying to parse this date Wed, 17 Feb 2021 13:00:00 +0100 into this 2021-02-17 13:00:00.000000000 +0100.
And I've tried using this Time.strptime(current_time.to_s, '%Q'), (where current_time it's the date above) but I get 1970-01-01 01:00:02.021 +0100
But I don't understand why I get another date, could you help me? Thanks!
I'm trying to parse this date Wed, 17 Feb 2021 13:00:00 +0100 [...]
You seem to already have an instance of Time: (or ActiveSupport::TimeWithZone which is Rails' drop-in replacement with better timezone support)
current_time = Time.current
#=> Thu, 19 May 2022 10:09:58.702560000 CEST +02:00
In this case, there's nothing to parse. You just have to format it via strftime the way you like:
current_time.strftime('%F %T.%N %z')
#=> "2022-05-19 10:09:58.702560000 +0200"
Parsing is only needed when you have a string representation that you want to turn into a Time object, e.g.: (using Rails' Time.zone.parse variant)
time_string = 'Thu, 19 May 2022 10:09:58.702560000 CEST +02:00'
time_obj = Time.zone.parse(time_string)
#=> Thu, 19 May 2022 10:09:58.702560000 CEST +02:00
time_obj.class
#=> ActiveSupport::TimeWithZone
Given a (UTC) DateTime object, how can I get the corresponding time in Berlin, in CET or CEST, depending on the date?
Examples for the desired "convert" function:
convert(DateTime.new(2018, 07))
=> Sun, 01 Jul 2018 02:00:00 +0200
convert(DateTime.new(2018, 12))
=> Sat, 01 Dec 2018 01:00:00 +0100
Try this
require 'tzinfo'
timezone = TZInfo::Timezone.get('Europe/Berlin')
local_time = timezone.utc_to_local(utc_time)
That even works without Rails.
I am trying to convert a date/time string "06/14/2016 07:00 PM" to a Time object under the PST time zone. I want the result to be Tue, 14 Jun 2016 19:00:00 PDT -07:00.
I tried the following:
t = "06/14/2016 07:00 PM"
r = Time.strptime(t, "%m/%d/%Y %I:%M %p").in_time_zone("Pacific Time (US & Canada)")
The time comes back as Tue, 14 Jun 2016 17:00:00 PDT -07:00. Any ideas?
This code to me works properly, but there are two possible issues that are giving you the wrong result:
You are not in the pacific time zone (or at least not according to your computer): You can test this by running r = Time.strptime(t, "%m/%d/%Y %I:%M %p"), and then printing the result of r. I'm willing to wager that it outputs
Tue, 14 Jun 2016 19:00:00 CDT -05:00
You are using ruby and not rails, in_time_zone is a method only in rails. If you try to use it in ruby it will not work.
I need to use .next_week not +1.week. Because the .next_week make the date next week and Monday at the same time. It's so comfortable. And then I subtract some hours. But nothing has been changed. Here's my code.
newDate = DateTime.now
newDate = newDate.next_week - 3.hours
=> Sun, 30 Aug 2015 21:00:00 +0900
newDate = newDate.next_week - 3.hours
=> Sun, 30 Aug 2015 21:00:00 +0900
newDate = newDate.next_week - 3.hours
=> Sun, 30 Aug 2015 21:00:00 +0900
Why they can't be used same time? Please explain to me. Thanks.
This has nothing to do with #next_week and - 3.hours working at the same time. It is a misunderstanding about how #next_week works.
#next_week assumes by default a week is Monday-Sunday. This means when calling just #next_week it will return the next Monday at 00:00:00:00.
Example:
DateTime.now.next_week
#=> Mon, 03 Aug 2015 00:00:00 -0400
Okay so that make sense. Now you are substracting 3.hours making it Sunday again
DateTime.now.next_week - 3.hours
#=> Sun, 02 Aug 2015 21:00:00 -0400
Still makes perfect sense. Now here is where the confusion is. Since you rolled back to Sunday by subtracting 3.hours the #next_week is the following Monday again so
(DateTime.now.next_week - 3.hours).next_week
#=> Mon, 03 Aug 2015 00:00:00 -0400
I hope this helps you understand the situation a bit better.
If you use + 1.week this will take you to the same exact point in time the following week
DateTime.now + 1.week
#=> Fri, 07 Aug 2015 09:01:17 -0400
This does not rely on a weekly calendar but rather the basic math of adding 7 days to the referenced Date object.
In conclusion while #next_week might be comfortable you need to understand what it actually implies and I think I would prefer + 1.week in this case for its flexibility and its lack of assumption.
There are also many other methods for traversing time through ActiveSupport such as #advance, #days_since, weeks_since, etc.
Final note next_week can accept a day parameter as well e.g
DateTime.now.next_week(:tuesday)
#=> Tue, 04 Aug 2015 00:00:00 -0400
DateTime.now.next_week(:thursday)
#=> Thu, 06 Aug 2015 00:00:00 -0400
I know it is common error but I could not resolve it even after trying those answers.
Through the rest api I am sending some parameters inculdes dates. I am recieving all the data in the method where I want but when I am trying to parse Date it throws error of invalid date.
Here are my parameters that I am recieving
{"uid"=>"1", "user"=>"abc.a#abc.com", "from"=>"Mon Nov 3 24:59:12 CET 2014", "to"=>"Tue Nov 11 24:59:12 CET 2014"}
and Date format is
Mon Nov 3 24:59:12 CET 2014
but it is throwing error on parsing on line below
fr = DateTime.parse(params[:from]) unless params[:from].empty?
I tried strptime as well but did not work.
Imp points is I need hour also for later processing. Thanks
what you are doing wrong is parsing DateTime while it is just date and should be parsed as one of the following ways:
1.
>> fr = params[:from].to_date unless params[:from].empty?
=> Mon, 03 Nov 2014
2.
>> fr = Date.parse(params[:from]) unless params[:from].empty?
=> Mon, 03 Nov 2014
You have 24:59 which is invalid time. Anyway, use strptime:
DateTime.strptime("Mon Nov 3 22:59:12 CET 2014", "%a %b %e %T %Z %Y")
#=> Mon, 03 Nov 2014 22:59:12 +0100