Class: Ourdate

Inherits:
Object
  • Object
show all
Defined in:
lib/ndr_support/ourdate.rb,
lib/ndr_support/ourdate/build_datetime.rb

Overview

Convert a string into a single date (helped by String.thedate)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(x = nil) ⇒ Ourdate

Returns a new instance of Ourdate.



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/ndr_support/ourdate.rb', line 34

def initialize(x = nil)
  if x.is_a?(Date)
    @thedate = x
  elsif x.is_a?(Time)
    @thedate = x.to_datetime
  elsif x.is_a?(String)
    self.source = x
  else
    @thedate = nil
  end
end

Instance Attribute Details

#thedateObject (readonly)

Returns the value of attribute thedate.



10
11
12
# File 'lib/ndr_support/ourdate.rb', line 10

def thedate
  @thedate
end

Class Method Details

.build_datetime(year, month = 1, day = 1, hour = 0, min = 0, sec = 0, usec = 0) ⇒ Object

Construct a daylight saving time safe datetime, with arguments – FIXME: Note that the arguments should be numbers, not strings – it works with strings arguments only after the 1970 epoch; before, it returns nil. ++



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
# File 'lib/ndr_support/ourdate/build_datetime.rb', line 10

def self.build_datetime(year, month = 1, day = 1, hour = 0, min = 0, sec = 0, usec = 0)
  return nil if year.nil?

  default_timezone = if ActiveRecord.respond_to?(:default_timezone)
                       ActiveRecord.default_timezone
                     else
                       ActiveRecord::Base.default_timezone # Rails <= 6.1
                     end
  if default_timezone == :local
    # Time.local_time(year, month, day, hour, min, sec, usec).to_datetime
    # Behave like oracle_adapter.rb
    seconds = sec + Rational(usec, 10**6)
    time_array = [year, month, day, hour, min, seconds]
    begin
      #--
      # TODO: Fails unit tests unless we .to_datetime here
      #       but the risk is we lose the usec component unnecesssarily.
      #       Investigate removing .to_datetime below.
      #++
      Time.send(default_timezone, *time_array).to_datetime
    rescue
      zone_offset = default_timezone == :local ? DateTime.now.offset : 0
      # Append zero calendar reform start to account for dates skipped by calendar reform
      DateTime.new(*time_array[0..5] << zone_offset << 0) rescue nil
    end
  else
    # Only supports fake GMT time -- needs improvement
    # Maybe use Time.zone.local or Time.local_time(year, month, day)
    Time.utc(year, month, day, hour, min, sec, usec).to_datetime
  end
end

.date_difference_in_years(date2, date1) ⇒ Object

Compute date difference in years (e.g. patient age), as an integer For a positive result, the later date should be the first argument. Leap days are treated as for age calculations.



67
68
69
70
# File 'lib/ndr_support/ourdate.rb', line 67

def self.date_difference_in_years(date2, date1)
  (date2.strftime('%Y%m%d').sub(/0229$/, '0228').to_i -
   date1.strftime('%Y%m%d').sub(/0229$/, '0228').to_i) / 10_000
end

.todayObject

We need a daylight saving time safe was of defining the date today.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/ndr_support/ourdate.rb', line 13

def self.today
  current_time = Time.now
  #--
  # TODO: Use Ourdate.build_datetime everywhere below:
  #++
  default_timezone = if ActiveRecord.respond_to?(:default_timezone)
                       ActiveRecord.default_timezone
                     else
                       ActiveRecord::Base.default_timezone # Rails <= 6.1
                     end
  if default_timezone == :local
    build_datetime(current_time.year, current_time.month, current_time.day)
  else
    #--
    # Only supports fake GMT time -- needs improvement
    # Maybe use Time.zone.local or Time.local_time(year, month, day)
    #++
    Time.gm(current_time.year, current_time.month, current_time.day, 0, 0, 0, 0).to_datetime
  end
end

Instance Method Details

#empty?Boolean

Returns:

  • (Boolean)


50
51
52
53
# File 'lib/ndr_support/ourdate.rb', line 50

def empty?
  # An unspecified date will be empty. A valid date will not.
  @thedate.nil?
end

#to_sObject



46
47
48
# File 'lib/ndr_support/ourdate.rb', line 46

def to_s
  @thedate ? @thedate.to_date.to_formatted_s(:ui) : ''
end