nickel 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/Rakefile +5 -1
- data/lib/nickel/construct.rb +31 -36
- data/lib/nickel/construct_finder.rb +442 -360
- data/lib/nickel/construct_interpreter.rb +50 -52
- data/lib/nickel/nlp.rb +18 -21
- data/lib/nickel/nlp_query.rb +471 -471
- data/lib/nickel/nlp_query_constants.rb +1 -1
- data/lib/nickel/occurrence.rb +7 -8
- data/lib/nickel/version.rb +1 -1
- data/lib/nickel/zdate.rb +86 -77
- data/lib/nickel/ztime.rb +58 -54
- data/spec/lib/nickel/construct_spec.rb +66 -0
- data/spec/lib/nickel/nlp_spec.rb +7 -7
- data/spec/lib/nickel/occurrence_spec.rb +20 -21
- data/spec/lib/nickel/zdate_spec.rb +49 -29
- data/spec/lib/nickel/ztime_spec.rb +174 -158
- data/spec/lib/nickel_spec.rb +687 -609
- data/spec/spec_helper.rb +2 -2
- metadata +4 -2
@@ -10,7 +10,7 @@ module Nickel
|
|
10
10
|
DATE_DD_WITH_SUFFIX_NB_ON_SUFFIX = %r{\b(0?[1-9]|[12][0-9]|3[01])(?:st|nd|rd|th)\b}
|
11
11
|
DATE_MM_SLASH_DD = %r{\b(?:0?[1-9]|[1][0-2])\/(?:0?[1-9]|[12][0-9]|3[01])}
|
12
12
|
DAY_OF_WEEK = %r{\b(mon|tue|wed|thu|fri|sat|sun)\b}
|
13
|
-
DAY_OF_WEEK_NB = %r{\b(?:mon|tue|wed|thu|fri|sat|sun)\b} #no backreference
|
13
|
+
DAY_OF_WEEK_NB = %r{\b(?:mon|tue|wed|thu|fri|sat|sun)\b} # no backreference
|
14
14
|
MONTH_OF_YEAR = %r{\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b}
|
15
15
|
MONTH_OF_YEAR_NB = %r{\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b}
|
16
16
|
TIME_24HR = %r{[01]?[0-9]|2[0-3]:[0-5][0-9]}
|
data/lib/nickel/occurrence.rb
CHANGED
@@ -1,24 +1,23 @@
|
|
1
1
|
module Nickel
|
2
|
-
|
3
2
|
# Some notes about this class, type can take the following values:
|
4
3
|
# :single, :daily, :weekly, :daymonthly, :datemonthly,
|
5
4
|
Occurrence = Struct.new(:type, :start_date, :end_date, :start_time, :end_time, :interval, :day_of_week, :week_of_month, :date_of_month) do
|
6
5
|
|
7
6
|
def initialize(h)
|
8
|
-
h.each { |k,v| send("#{k}=", v) }
|
7
|
+
h.each { |k, v| send("#{k}=", v) }
|
9
8
|
end
|
10
9
|
|
11
10
|
def inspect
|
12
|
-
|
11
|
+
'#<Occurrence ' + members.select { |m| self[m] }.map { |m| %(#{m}: #{self[m]}) }.join(', ') + '>'
|
13
12
|
end
|
14
13
|
|
15
14
|
def finalize(cur_date)
|
16
15
|
cur_date = start_date unless start_date.nil?
|
17
16
|
case type
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
when :daily then finalize_daily(cur_date)
|
18
|
+
when :weekly then finalize_weekly(cur_date)
|
19
|
+
when :datemonthly then finalize_datemonthly(cur_date)
|
20
|
+
when :daymonthly then finalize_daymonthly(cur_date)
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
@@ -33,7 +32,7 @@ module Nickel
|
|
33
32
|
# starting DATE"; we want to find the first occurrence after DATE
|
34
33
|
self.start_date = cur_date.this(day_of_week)
|
35
34
|
|
36
|
-
|
35
|
+
unless end_date.nil?
|
37
36
|
# find the real end date, if someone says "every monday until
|
38
37
|
# dec 1"; find the actual last occurrence
|
39
38
|
self.end_date = end_date.prev(day_of_week)
|
data/lib/nickel/version.rb
CHANGED
data/lib/nickel/zdate.rb
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
require 'date'
|
2
2
|
|
3
3
|
module Nickel
|
4
|
-
|
5
4
|
# TODO: get methods should accept dayname or dayindex
|
6
5
|
class ZDate
|
7
6
|
include Comparable
|
8
7
|
|
9
|
-
@days_of_week =
|
10
|
-
@full_days_of_week =
|
11
|
-
@months_of_year =
|
12
|
-
@full_months_of_year =
|
8
|
+
@days_of_week = %w(mon tue wed thu fri sat sun)
|
9
|
+
@full_days_of_week = %w(monday tuesday wednesday thursday friday saturday sunday)
|
10
|
+
@months_of_year = %w(jan feb mar apr may jun jul aug sep oct nov dec)
|
11
|
+
@full_months_of_year = %w(january february march april may june july august september october november december)
|
13
12
|
@days_in_common_year_months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
14
13
|
@days_in_leap_year_months = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
15
14
|
|
@@ -27,8 +26,8 @@ module Nickel
|
|
27
26
|
|
28
27
|
# Don't use attr_accessor for date, year, month, day; we want to validate on change.
|
29
28
|
def initialize(yyyymmdd = nil)
|
30
|
-
d = yyyymmdd ? yyyymmdd.dup : ::Time.new.strftime(
|
31
|
-
d.gsub!(/-/,'') # remove any hyphens, so a user can initialize with something like "2008-10-23"
|
29
|
+
d = yyyymmdd ? yyyymmdd.dup : ::Time.new.strftime('%Y%m%d')
|
30
|
+
d.gsub!(/-/, '') # remove any hyphens, so a user can initialize with something like "2008-10-23"
|
32
31
|
self.date = d
|
33
32
|
end
|
34
33
|
|
@@ -70,25 +69,30 @@ module Nickel
|
|
70
69
|
end
|
71
70
|
|
72
71
|
def fmt(txt)
|
73
|
-
txt.gsub!(/%Y/,
|
74
|
-
txt.gsub!(/%m/,
|
75
|
-
txt.gsub!(/%d/,
|
72
|
+
txt.gsub!(/%Y/, year_str)
|
73
|
+
txt.gsub!(/%m/, month_str)
|
74
|
+
txt.gsub!(/%d/, day_str)
|
76
75
|
end
|
77
76
|
|
78
|
-
def <=>(
|
79
|
-
return nil unless [:year, :month, :day].all?{|m|
|
77
|
+
def <=>(other)
|
78
|
+
return nil unless [:year, :month, :day].all? { |m| other.respond_to?(m) }
|
80
79
|
|
81
|
-
if before?(
|
80
|
+
if before?(other)
|
82
81
|
-1
|
83
|
-
elsif after?(
|
82
|
+
elsif after?(other)
|
84
83
|
1
|
85
84
|
else
|
86
85
|
0
|
87
86
|
end
|
88
87
|
end
|
89
88
|
|
90
|
-
# returns true if self is today
|
91
89
|
def is_today?
|
90
|
+
warn '[DEPRECATION] `is_today?` is deprecated. Please use `today?` instead.'
|
91
|
+
today?
|
92
|
+
end
|
93
|
+
|
94
|
+
# returns true if self is today
|
95
|
+
def today?
|
92
96
|
self == ZDate.new
|
93
97
|
end
|
94
98
|
|
@@ -103,7 +107,9 @@ module Nickel
|
|
103
107
|
# we want the last occurrence of this month
|
104
108
|
# add 4 weeks to first occurrence, see if we are in the same month, subtract 1 week if we are not
|
105
109
|
d = first_occ_date.add_weeks(4)
|
106
|
-
if d.month !=
|
110
|
+
if d.month != month
|
111
|
+
d = d.sub_weeks(1)
|
112
|
+
end
|
107
113
|
end
|
108
114
|
d
|
109
115
|
end
|
@@ -120,12 +126,12 @@ module Nickel
|
|
120
126
|
|
121
127
|
# for example, "previous friday"
|
122
128
|
def prev(day)
|
123
|
-
(
|
129
|
+
(dayindex == day) ? dup : x_weeks_from_day(-1, day)
|
124
130
|
end
|
125
131
|
|
126
132
|
# returns a new date object
|
127
133
|
def x_weeks_from_day(weeks_away, day2index)
|
128
|
-
day1index =
|
134
|
+
day1index = dayindex
|
129
135
|
if day1index > day2index
|
130
136
|
days_away = 7 * (weeks_away + 1) - (day1index - day2index)
|
131
137
|
elsif day1index < day2index
|
@@ -133,20 +139,22 @@ module Nickel
|
|
133
139
|
elsif day1index == day2index
|
134
140
|
days_away = 7 * weeks_away
|
135
141
|
end
|
136
|
-
|
142
|
+
add_days(days_away) # returns a new date object
|
137
143
|
end
|
138
144
|
|
139
145
|
# add_ methods return new ZDate object, they DO NOT modify self
|
140
146
|
def add_days(number)
|
141
|
-
if number < 0
|
142
|
-
|
147
|
+
if number < 0
|
148
|
+
return sub_days(number.abs)
|
149
|
+
end
|
150
|
+
o = dup # new ZDate object
|
143
151
|
# Let's see what month we are going to end in
|
144
152
|
while number > 0
|
145
153
|
if o.days_left_in_month >= number
|
146
154
|
o.date = ZDate.format_date(o.year_str, o.month_str, o.day + number)
|
147
155
|
number = 0
|
148
156
|
else
|
149
|
-
number = number - 1 - o.days_left_in_month #it costs 1 day to increment the month
|
157
|
+
number = number - 1 - o.days_left_in_month # it costs 1 day to increment the month
|
150
158
|
o.increment_month!
|
151
159
|
end
|
152
160
|
end
|
@@ -154,7 +162,7 @@ module Nickel
|
|
154
162
|
end
|
155
163
|
|
156
164
|
def add_weeks(number)
|
157
|
-
|
165
|
+
add_days(7 * number)
|
158
166
|
end
|
159
167
|
|
160
168
|
def add_months(number)
|
@@ -165,14 +173,14 @@ module Nickel
|
|
165
173
|
years_to_increment = 0
|
166
174
|
end
|
167
175
|
new_year = year + years_to_increment
|
168
|
-
new_day = get_day_or_max_day_in_month(
|
176
|
+
new_day = get_day_or_max_day_in_month(day, new_month, new_year)
|
169
177
|
ZDate.new(ZDate.format_date(new_year, new_month, new_day))
|
170
178
|
end
|
171
179
|
|
172
180
|
def add_years(number)
|
173
181
|
new_year = year + number
|
174
|
-
new_day = get_day_or_max_day_in_month(
|
175
|
-
ZDate.new(ZDate.format_date(new_year,
|
182
|
+
new_day = get_day_or_max_day_in_month(day, month, new_year)
|
183
|
+
ZDate.new(ZDate.format_date(new_year, month_str, new_day))
|
176
184
|
end
|
177
185
|
|
178
186
|
# DEPRECATED, change_ methods in ZTime modify self, this was confusing,
|
@@ -190,7 +198,7 @@ module Nickel
|
|
190
198
|
# returns the first day of the month
|
191
199
|
def jump_to_month(month_number)
|
192
200
|
# find difference in months
|
193
|
-
if month_number >=
|
201
|
+
if month_number >= month
|
194
202
|
ZDate.new(ZDate.format_date(year_str, month_number))
|
195
203
|
else
|
196
204
|
ZDate.new(ZDate.format_date(year + 1, month_number))
|
@@ -203,24 +211,24 @@ module Nickel
|
|
203
211
|
end
|
204
212
|
|
205
213
|
def end_of_month
|
206
|
-
ZDate.new(ZDate.format_date(year_str, month_str,
|
214
|
+
ZDate.new(ZDate.format_date(year_str, month_str, days_in_month))
|
207
215
|
end
|
208
216
|
|
209
217
|
def beginning_of_next_month
|
210
|
-
o =
|
218
|
+
o = dup
|
211
219
|
o.increment_month!
|
212
220
|
o
|
213
221
|
end
|
214
222
|
|
215
223
|
# sub_ methods return new ZDate object, they do not modify self.
|
216
224
|
def sub_days(number)
|
217
|
-
o =
|
225
|
+
o = dup
|
218
226
|
while number > 0
|
219
227
|
if (o.day - 1) >= number
|
220
228
|
o.date = ZDate.format_date(o.year_str, o.month_str, o.day - number)
|
221
229
|
number = 0
|
222
230
|
else
|
223
|
-
number
|
231
|
+
number -= o.day
|
224
232
|
o.decrement_month!
|
225
233
|
end
|
226
234
|
end
|
@@ -228,11 +236,11 @@ module Nickel
|
|
228
236
|
end
|
229
237
|
|
230
238
|
def sub_weeks(number)
|
231
|
-
|
239
|
+
sub_days(7 * number)
|
232
240
|
end
|
233
241
|
|
234
242
|
def sub_months(number)
|
235
|
-
o =
|
243
|
+
o = dup
|
236
244
|
number.times do
|
237
245
|
o.decrement_month!
|
238
246
|
end
|
@@ -243,9 +251,9 @@ module Nickel
|
|
243
251
|
def diff_in_days(date_to_compare)
|
244
252
|
# d1 will be the earlier date, d2 the later
|
245
253
|
if date_to_compare > self
|
246
|
-
d1, d2 =
|
254
|
+
d1, d2 = dup, date_to_compare.dup
|
247
255
|
elsif self > date_to_compare
|
248
|
-
d1, d2 = date_to_compare.dup,
|
256
|
+
d1, d2 = date_to_compare.dup, dup
|
249
257
|
else
|
250
258
|
return 0 # same date
|
251
259
|
end
|
@@ -260,11 +268,11 @@ module Nickel
|
|
260
268
|
end
|
261
269
|
|
262
270
|
def diff_in_days_to_this(closest_day_index)
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
271
|
+
if closest_day_index >= dayindex
|
272
|
+
closest_day_index - dayindex # could be 0
|
273
|
+
else # day_num < self.dayindex
|
274
|
+
7 - (dayindex - closest_day_index)
|
275
|
+
end
|
268
276
|
end
|
269
277
|
|
270
278
|
# We need days_in_months and diff_in_months to be available at the class level as well.
|
@@ -296,7 +304,7 @@ module Nickel
|
|
296
304
|
diff_in_months = 12 - (month1 - month2)
|
297
305
|
year2 -= 1 # this makes the next line nice
|
298
306
|
end
|
299
|
-
diff_in_months
|
307
|
+
diff_in_months + (year2 - year1) * 12
|
300
308
|
end
|
301
309
|
|
302
310
|
def format_year(y)
|
@@ -313,7 +321,7 @@ module Nickel
|
|
313
321
|
end
|
314
322
|
|
315
323
|
# formats the year, month, day into the format expected by the ZDate constructor
|
316
|
-
def format_date(year, month=1, day=1)
|
324
|
+
def format_date(year, month = 1, day = 1)
|
317
325
|
format_year(year) + format_month(month) + format_day(day)
|
318
326
|
end
|
319
327
|
|
@@ -349,9 +357,9 @@ module Nickel
|
|
349
357
|
# d.) 1st 10th
|
350
358
|
def interpret(str, current_date)
|
351
359
|
day_str, month_str, year_str = nil, nil, nil
|
352
|
-
ambiguous = {:
|
360
|
+
ambiguous = { month: false, year: false } # assume false, we use this flag if we aren't certain about the year
|
353
361
|
|
354
|
-
#appropriate matches
|
362
|
+
# appropriate matches
|
355
363
|
a_d = /^(\d{1,2})(rd|st|nd|th)?$/ # handles cases a and d
|
356
364
|
b = /^(\d{1,2})\/(\d{1,2})$/ # handles case b
|
357
365
|
c = /^(\d{1,2})\/(\d{1,2})\/(\d{2}|\d{4})$/ # handles case c
|
@@ -377,9 +385,9 @@ module Nickel
|
|
377
385
|
if date
|
378
386
|
if ambiguous[:year]
|
379
387
|
# say the date is 11/1 and someone enters 2/1, they probably mean next year, I pick 4 months as a threshold but that is totally arbitrary
|
380
|
-
current_date.diff_in_months(date) < -4
|
388
|
+
current_date.diff_in_months(date) < -4 && date = date.add_years(1)
|
381
389
|
elsif ambiguous[:month]
|
382
|
-
current_date.day > date.day
|
390
|
+
current_date.day > date.day && date = date.add_months(1)
|
383
391
|
end
|
384
392
|
end
|
385
393
|
date
|
@@ -390,70 +398,70 @@ module Nickel
|
|
390
398
|
# if self is nov 14 and date2 is oct 1, will return -1
|
391
399
|
def diff_in_months(date2)
|
392
400
|
if date2 > self
|
393
|
-
ZDate.diff_in_months(
|
401
|
+
ZDate.diff_in_months(month, year, date2.month, date2.year)
|
394
402
|
else
|
395
|
-
ZDate.diff_in_months(date2.month, date2.year,
|
403
|
+
ZDate.diff_in_months(date2.month, date2.year, month, year) * -1
|
396
404
|
end
|
397
405
|
end
|
398
406
|
|
399
407
|
def days_in_month
|
400
408
|
if leap_year?
|
401
|
-
ZDate.days_in_leap_year_months[
|
409
|
+
ZDate.days_in_leap_year_months[month - 1]
|
402
410
|
else
|
403
|
-
ZDate.days_in_common_year_months[
|
411
|
+
ZDate.days_in_common_year_months[month - 1]
|
404
412
|
end
|
405
413
|
end
|
406
414
|
|
407
415
|
def days_left_in_month
|
408
|
-
|
416
|
+
days_in_month - day
|
409
417
|
end
|
410
418
|
|
411
419
|
def months_left_in_year
|
412
|
-
12 -
|
420
|
+
12 - month
|
413
421
|
end
|
414
422
|
|
415
423
|
def dayname
|
416
424
|
# well this is going to be a hack, I need an algo for finding the day
|
417
425
|
# Ruby's Time.local is the fastest way to create a Ruby Time object
|
418
|
-
t = ::Time.local(
|
419
|
-
t.strftime(
|
426
|
+
t = ::Time.local(year, ZDate.months_of_year[month - 1], day)
|
427
|
+
t.strftime('%a').downcase
|
420
428
|
end
|
421
429
|
|
422
430
|
def dayindex
|
423
|
-
ZDate.days_of_week.index(
|
431
|
+
ZDate.days_of_week.index(dayname)
|
424
432
|
end
|
425
433
|
|
426
434
|
def full_dayname
|
427
|
-
ZDate.full_days_of_week[
|
435
|
+
ZDate.full_days_of_week[dayindex]
|
428
436
|
end
|
429
437
|
|
430
438
|
def full_monthname
|
431
|
-
Z.full_months_of_year[
|
439
|
+
Z.full_months_of_year[month - 1]
|
432
440
|
end
|
433
441
|
|
434
442
|
def leap_year?
|
435
|
-
|
443
|
+
year % 400 == 0 || year % 4 == 0 && year % 100 != 0
|
436
444
|
end
|
437
445
|
|
438
446
|
def day_of_year
|
439
|
-
doy =
|
447
|
+
doy = day
|
440
448
|
# iterate through days in months arrays, summing up the days
|
441
449
|
if leap_year?
|
442
|
-
doy = (1...
|
450
|
+
doy = (1...month).to_a.reduce(doy) { |sum, n| sum + ZDate.days_in_leap_year_months[n - 1] }
|
443
451
|
else
|
444
|
-
doy = (1...
|
452
|
+
doy = (1...month).to_a.reduce(doy) { |sum, n| sum + ZDate.days_in_common_year_months[n - 1] }
|
445
453
|
end
|
446
454
|
doy
|
447
455
|
end
|
448
456
|
|
449
457
|
def days_left_in_year
|
450
|
-
leap_year? ? 366 -
|
458
|
+
leap_year? ? 366 - day_of_year : 365 - day_of_year
|
451
459
|
end
|
452
460
|
|
453
461
|
def get_date_from_day_and_week_of_month(day_num, week_num)
|
454
462
|
# This method is extremely sloppy, clean it up
|
455
463
|
# Get the index of the first day of this month
|
456
|
-
first_day_of_month =
|
464
|
+
first_day_of_month = beginning_of_month
|
457
465
|
first_day_index = first_day_of_month.dayindex
|
458
466
|
|
459
467
|
diff_in_days_to_first_occ = first_day_of_month.diff_in_days_to_this(day_num)
|
@@ -466,16 +474,16 @@ module Nickel
|
|
466
474
|
end
|
467
475
|
|
468
476
|
# there is a chance that the last occurrence is not the 4th week of the month; if that is the case, add an extra 7 days
|
469
|
-
if (week_num == -1) && (
|
477
|
+
if (week_num == -1) && (month == beginning_of_month.add_days(total_diff_in_days + 7).month)
|
470
478
|
total_diff_in_days += 7
|
471
479
|
end
|
472
480
|
|
473
481
|
# Now we have the number of days FROM THE START OF THE CURRENT MONTH; if we are not past that date, then we have found the first occurrence
|
474
|
-
if (total_diff_in_days + 1) >=
|
475
|
-
return
|
482
|
+
if (total_diff_in_days + 1) >= day
|
483
|
+
return beginning_of_month.add_days(total_diff_in_days)
|
476
484
|
else # We have already past the date; calculate the occurrence next month!
|
477
485
|
# Get the index of the first day next month
|
478
|
-
first_day_index =
|
486
|
+
first_day_index = add_months(1).beginning_of_month.dayindex
|
479
487
|
|
480
488
|
# Find the number of days away to the day of interest (NOT the week)
|
481
489
|
if day_num > first_day_index
|
@@ -494,17 +502,17 @@ module Nickel
|
|
494
502
|
end
|
495
503
|
|
496
504
|
# there is a chance that the last occurrence is not the 4th week of the month; if that is the case, add an extra 7 days
|
497
|
-
if (week_num == -1) && (
|
505
|
+
if (week_num == -1) && (add_months(1).month == add_months(1).beginning_of_month.add_days(total_diff_in_days + 7).month)
|
498
506
|
total_diff_in_days += 7
|
499
507
|
end
|
500
508
|
|
501
|
-
return
|
509
|
+
return add_months(1).beginning_of_month.add_days(total_diff_in_days)
|
502
510
|
end # END if (total_diff_in_days + 1) ...
|
503
511
|
end
|
504
512
|
|
505
513
|
# returns a new ZDate object, NOTE! this returns nil if that date does not exist (sept 31st)
|
506
514
|
def get_next_date_from_date_of_month(date_of_month)
|
507
|
-
o =
|
515
|
+
o = dup
|
508
516
|
if day == date_of_month
|
509
517
|
o
|
510
518
|
else
|
@@ -524,6 +532,7 @@ module Nickel
|
|
524
532
|
end
|
525
533
|
|
526
534
|
protected
|
535
|
+
|
527
536
|
# Modifies self.
|
528
537
|
# bumps self to first day of next month
|
529
538
|
def increment_month!
|
@@ -546,16 +555,16 @@ module Nickel
|
|
546
555
|
|
547
556
|
private
|
548
557
|
|
549
|
-
def before?(
|
550
|
-
(year <
|
558
|
+
def before?(other)
|
559
|
+
(year < other.year) || (year == other.year && (month < other.month || (month == other.month && day < other.day)))
|
551
560
|
end
|
552
561
|
|
553
|
-
def after?(
|
554
|
-
(year >
|
562
|
+
def after?(other)
|
563
|
+
(year > other.year) || (year == other.year && (month > other.month || (month == other.month && day > other.day)))
|
555
564
|
end
|
556
565
|
|
557
566
|
def validate
|
558
|
-
|
567
|
+
fail 'ZDate says: invalid date' unless valid
|
559
568
|
end
|
560
569
|
|
561
570
|
def valid
|
@@ -568,11 +577,11 @@ module Nickel
|
|
568
577
|
end
|
569
578
|
|
570
579
|
def valid_month
|
571
|
-
month >= 1
|
580
|
+
month >= 1 && month <= 12
|
572
581
|
end
|
573
582
|
|
574
583
|
def valid_day
|
575
|
-
day >= 1
|
584
|
+
day >= 1 && day <= days_in_month
|
576
585
|
end
|
577
586
|
|
578
587
|
def get_day_or_max_day_in_month(day, month, year)
|