-
Notifications
You must be signed in to change notification settings - Fork 3.2k
/
date.rb
69 lines (52 loc) · 1.5 KB
/
date.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# frozen_string_literal: true
module Faker
class Date < Base
class << self
def between(from, to)
from = get_date_object(from)
to = get_date_object(to)
Faker::Base.rand_in_range(from, to)
end
def between_except(from, to, excepted)
raise ArgumentError, 'From date, to date and excepted date must not be the same' if from == to && to == excepted
excepted = get_date_object(excepted)
loop do
date = between(from, to)
break date.to_date if date != excepted
end
end
def forward(days = 365)
from = ::Date.today + 1
to = ::Date.today + days
between(from, to).to_date
end
def backward(days = 365)
from = ::Date.today - days
to = ::Date.today - 1
between(from, to).to_date
end
def birthday(min_age = 18, max_age = 65)
t = ::Date.today
from = birthday_date(t, max_age)
to = birthday_date(t, min_age)
between(from, to).to_date
end
private
def birthday_date(date, age)
year = date.year - age
day =
if date.day == 29 && date.month == 2 && !::Date.leap?(year)
28
else
date.day
end
::Date.new(year, date.month, day)
end
def get_date_object(date)
date = ::Date.parse(date) if date.is_a?(::String)
date = date.to_date if date.respond_to?(:to_date)
date
end
end
end
end