Mock the date for Date.parse - ruby

I am doing some tests on date parsing. I was able to mock the date by doing as below:
my_str_date = '08022014at0600 +00:00'
my_new_date = DateTime.strptime(my_str_date, "%d%m%Yat%H%M %z").to_time
Time.stub(:now).and_return(my_new_date)
This is good enough most of the time, but when I want to get a date based on the day of the week, I do Date.parse('wednesday') for example, and unfortunately, it takes the current date.
I don't know how to find a global solution to simulate a specific date in the year that would work for Time.now and Date.parse. Any idea?
I though about Timecop library, but it does not seem to handle my case.

require 'time'
def get_weekday_date(name, ref = Date.today)
day = {"sun"=>0, "mon"=>1, "tue"=>2, "wed"=>3, "thu"=>4, "fri"=>5, "sat"=>6}[name[0, 3].downcase]
ref - ref.wday + day
end
date = get_weekday_date('wed', Date.parse("2010-10-10"))
puts date.strftime('%Y-%m-%d %A') ## 2010-10-13 Wednesday

I was not able to do a clear integration test on a feature that parse a String because Date.parse does not use Time.now as reference for the current time. So I decided to use Chronic.parse from chronic gem and not Date.parse anymore.
The mock on Time.now is now use when I call Chronic.parse('wednesday'), and it helps me to check my feature is working properly based on a specific Time.now

Related

Can I use NSISO8601DateFormatter to parse an ISO-8601 string?

Foundation in macOS 10.12 has a new class, NSISO8601DateFormatter, which claims to be able to parse ISO-8601, but I'm having trouble understanding how to use it.
It takes a .formatOptions, which it says is used for parsing, too. Isn't the whole point of ISO-8601 that it's an unambiguous format?
For example, this works:
let f = ISO8601DateFormatter()
f.formatOptions = [.withFullDate]
f.date(from: "2018-11-26") // a Date
but this ignores the time:
let f = ISO8601DateFormatter()
f.formatOptions = [.withFullDate]
f.date(from: "2018-11-26T18:07:13Z") // a Date but wrong
If I add .withFullTime, this works, but then the first example fails.
How do I parse ISO-8601 with NSISO8601DateFormatter? Do I need to first pre-parse it on my own to figure out what sub-format of ISO-8601 it uses?

Ruby spreadsheet datetime error

I have a row that looks like the following (in a .xls):
bob abc 6/14/14 8:23
I want to return the date and time as: 61414823
I tried to get started with:
def self.regex_date
_test_column = #sheet.row(1)[2].date
...
end
Which I read about here: How to retrieve date properly using spreadsheet gem in ruby
But I'm getting the following error, before I can get to the regex part:
in `regex_date': undefined method `date' for #<DateTime:0x007f94e111b700> (NoMethodError)
It means that #sheet.row(1)[2] is a DateTime object. It doesn't have .date method. Instead, you can use .to_date.
But I don't understand why do you want to convert it to Date. What you want is to use .strftime like this:
#sheet.row(1)[2].strftime("%-m%-d%y%-k%M")
DateTime.new(2014, 6, 14, 8, 23).strftime("%-m%-d%y%-k%M") # => "61414823"

Generate Timestamp in Ruby

I am getting a timestamp value in an xml request as the following format.
2014-06-27T12:41:13.0000617Z
I need to form the xml response with this kind of time format in ruby. How do I get this format for the corresponding time?
I wanted to know the name of this format.
Try this:
t = Time.utc(2010,3,30, 5,43,"25.123456789".to_r)
t.iso8601(10)
This produces:
"2010-03-30T05:43:25.1234567890Z"
require 'date'
datetime = DateTime.parse('2014-06-27T12:41:13.0000617Z')
repr = datetime.strftime('%Y-%m-%dT%H:%M:%S.%7NZ')
puts repr
#=> 2014-06-27T12:41:13.0000617Z

Datetime in ruby

How to i convert "04/16/2012 03:44:26" string to datetime object in ruby?
I knew that "20120416" can be converted to datetime object by DateTime.parse(srting).
Please some one help me in converting "04/16/2012 03:44:26" to datetime object in ruby. And i need to add x minute to the above datetime object.
You need to specify the format using DateTime#strptime:
DateTime.strptime("04/16/2012 03:44:26", '%m/%d/%Y %H:%M:%S')
See: http://ruby-doc.org/stdlib-1.8.7/libdoc/date/rdoc/DateTime.html#method-c-strptime
You can add x minutes like so: + (x / (24 * 60.0)).
If you are using Rails or have no problems using ActiveSupport, you can just do:
require 'active_support'
new_datetime = datetime + 10.minutes
(Time.parse("04/16/2012 03:44:26") + 10.minutes).to_datetime
UPDATE
Works even in Ruby 1.8.7, but you need to require ActiveSupport (used automatically in Rails).

Ruby - convert string to date

I have a string like "2011-06-02T23:59:59+05:30".
I want to convert it to date format and need to parse only the date, "2011-06-02".
For Ruby 1.9.2:
require 'date' # If not already required. If in Rails then you don't need this line).
puts DateTime.parse("2011-06-02T23:59:59+05:30").to_date.to_s
require 'date'
d = Date.parse("2011-06-02T23:59:59+05:30")
d.strftime("%F")
Simplies way is
require 'date'
date = "2011-06-02T23:59:59+05:30".gsub(/T.*/, '')
DateTime.parse(date)
Time.parse() should allow you to parse the whole date time. Then you can use time.strftime( string ) to format that as just a date in a string.
date = Time.parse("2011-06-02T23:59:59+05:30")
date_string = time.strftime("%y-%m-%d")
of
date_string = time.strftime("%F")
(see Ruby Doc for Time for more output string formats)
The above should work if you want a string; if you want a date object to handle then the ruby Date class can help you handle it but I belive that everything still needs to be done with Time objects; see Ruby Doc for Date for details of the Date class.
Hope that helps, let me know if I have headed off in the wrong direction with my answer.

Resources