Class: Ourdate
- Inherits:
-
Object
- Object
- Ourdate
- 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
-
#thedate ⇒ Object
readonly
Returns the value of attribute thedate.
Class Method Summary collapse
-
.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.
-
.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.
-
.today ⇒ Object
We need a daylight saving time safe was of defining the date today.
Instance Method Summary collapse
- #empty? ⇒ Boolean
-
#initialize(x = nil) ⇒ Ourdate
constructor
A new instance of Ourdate.
- #to_s ⇒ Object
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
#thedate ⇒ Object (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 |
.today ⇒ Object
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
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_s ⇒ Object
46 47 48 |
# File 'lib/ndr_support/ourdate.rb', line 46 def to_s @thedate ? @thedate.to_date.to_formatted_s(:ui) : '' end |