Class: Date

Inherits:
Object show all
Defined in:
lib/doh/core/date.rb,
lib/doh/util/to_display.rb,
lib/doh/util/banking_workday.rb

Direct Known Subclasses

DohDb::DateToday

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.days_in_month(year, month) ⇒ Object



5
6
7
# File 'lib/doh/core/date.rb', line 5

def self.days_in_month(year, month)
  civil(year, month, -1).mday
end

.short_weekday_to_num(weekday) ⇒ Object



40
41
42
43
# File 'lib/doh/core/date.rb', line 40

def self.short_weekday_to_num(weekday)
  @@short_days_of_week ||= Time::RFC2822_DAY_NAME.collect {|day| day.downcase}
  @@short_days_of_week.index(weekday.downcase)
end

.smart_parse(datestr) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/doh/core/date.rb', line 9

def self.smart_parse(datestr)
  if datestr =~ /\A(\d\d)\/(\d\d)\/(\d\d)\z/
    month = $1.to_i
    mday = $2.to_i
    year = $3.to_i
    result = Date.new(year, month, mday)
  else
    result = Date.parse(datestr)
  end

  if result.year < 50
    result = Date.new(result.year + 2000, result.month, result.day)
  elsif result.year < 100
    result = Date.new(result.year + 1900, result.month, result.day)
  end
  result
end

Instance Method Details

#add_months(months, new_day = nil) ⇒ Object



57
58
59
60
61
62
63
64
# File 'lib/doh/core/date.rb', line 57

def add_months(months, new_day = nil)
  total_month = month + months
  new_month = total_month % 12
  new_month = 12 if new_month == 0
  new_year = year + ((total_month - 1) / 12)
  calc_day = [mday, Date.days_in_month(new_year, new_month)].min
  Date.new(new_year, new_month, new_day || calc_day)
end

#add_years(years) ⇒ Object



66
67
68
69
70
# File 'lib/doh/core/date.rb', line 66

def add_years(years)
  new_year = year + years
  calc_day = [mday, Date.days_in_month(new_year, month)].min
  Date.new(new_year, month, calc_day)
end

#backward_banking_workday(count = 1) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/doh/util/banking_workday.rb', line 37

def backward_banking_workday(count = 1)
  retval = self
  until retval.banking_workday?
    retval = retval - 1
  end
  count.times do
    begin
      retval = retval - 1
    end until retval.banking_workday?
  end
  retval
end

#banking_holiday?Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/doh/util/banking_workday.rb', line 20

def banking_holiday?
  weekday? && !banking_workday?
end

#banking_workday?Boolean

algoritm based on www.federalreserve.gov/releases/k8/default.htm and wikipedia pages about the individual holidays

Returns:

  • (Boolean)


5
6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/doh/util/banking_workday.rb', line 5

def banking_workday?
  return false if wday == 0 || wday == 6
  !(case month
  when 1 then (mday == 1) || ((wday == 1) && ((mday == 2) || (mday > 14 && mday < 22)))
  when 2 then (wday == 1) && (mday > 14 && mday < 22)
  when 5 then (wday == 1) && (mday > 24)
  when 7 then (mday == 4) || ((mday == 5) && (wday == 1))
  when 9 then (wday == 1) && (mday < 8)
  when 10 then (wday == 1) && (mday > 7) && (mday < 15)
  when 11 then (mday == 11) || ((mday == 12) && (wday == 1)) || ((wday == 4) && (mday > 21 && mday < 29))
  when 12 then (mday == 25) || ((mday == 26) && (wday == 1))
  else false
  end)
end

#date_onlyObject



36
37
38
# File 'lib/doh/core/date.rb', line 36

def date_only
  self
end

#forward_banking_workday(count = 1) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/doh/util/banking_workday.rb', line 24

def forward_banking_workday(count = 1)
  retval = self
  until retval.banking_workday?
    retval = retval + 1
  end
  count.times do
    begin
      retval = retval + 1
    end until retval.banking_workday?
  end
  retval
end

#inspectObject



28
29
30
# File 'lib/doh/core/date.rb', line 28

def inspect
  strftime('%F')
end

#make_datetime(hour = 0, min = 0, sec = 0) ⇒ Object



53
54
55
# File 'lib/doh/core/date.rb', line 53

def make_datetime(hour = 0, min = 0, sec = 0)
  DateTime.new(year, month, mday, hour, min, sec)
end

#next_weekend_dayObject



50
51
52
53
54
55
56
# File 'lib/doh/util/banking_workday.rb', line 50

def next_weekend_day
  retval = self + 1
  until !retval.weekday?
    retval += 1
  end
  retval
end

#previous_weekend_dayObject



58
59
60
61
62
63
64
# File 'lib/doh/util/banking_workday.rb', line 58

def previous_weekend_day
  retval = self - 1
  until !retval.weekday?
    retval -= 1
  end
  retval
end

#to_displayObject



17
18
19
# File 'lib/doh/util/to_display.rb', line 17

def to_display
  strftime('%m/%d/%Y')
end

#weekday?Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/doh/core/date.rb', line 32

def weekday?
  (wday > 0) && (wday < 6)
end

#years_since(date) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/doh/core/date.rb', line 45

def years_since(date)
  years_diff = year - date.year
  if month < date.month || (month == date.month && day < date.day)
    years_diff -= 1
  end
  years_diff
end