Changeset 151


Ignore:
Timestamp:
Jul 1, 2009, 10:11:42 PM (15 years ago)
Author:
KOBAYASHI, Shinji
Message:

fixed #49

Location:
ruby/trunk/lib/models
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • ruby/trunk/lib/models/rm/data_types/quantity/date_time.rb

    r150 r151  
    33# Ticket refs #49
    44require 'assumed_library_types'
    5 
     5require 'date'
    66
    77module OpenEHR
     
    119119              minute = ((diff - hour*60*60)/60).to_i
    120120              second = (diff - hour * 60 *60 - minute * 60).to_i
    121               fractional_second = ((diff - diff.to_i)*1000.0).to_i/1000.0
    122               return 'P0Y0M0W0DT' + hour.to_s + 'H' + minute.to_s + 'M' +
    123                 second.to_s + fractional_second.to_s[1..-1] + 'S'
    124             end
    125           end
    126 
    127           class DV_Date_Time < DV_Date
    128             include OpenEHR::Assumed_Library_Types::ISO8601_TIME_MODULE
    129            
    130             def initialize
     121              fractional_second = ((diff - diff.to_i)*1000000.0).to_i/1000000.0
     122              return DV_Duration.new('P0Y0M0W0DT' + hour.to_s + 'H' +
     123                        minute.to_s + 'M' +
     124                        second.to_s + fractional_second.to_s[1..-1] + 'S')
     125            end
     126          end
     127
     128          class DV_Date_Time < DV_Temporal
     129            include OpenEHR::Assumed_Library_Types::ISO8601_DATE_TIME_MODULE
     130            attr_reader :value
     131
     132            def initialize(value, magnitude_status=nil, accuracy=nil,
     133                           normal_range=nil, normal_status=nil,
     134                           other_reference_range=nil)
     135              super(value, magnitude_status, accuracy, normal_range,
     136                    normal_status, other_reference_range)
     137            end
     138
     139            def value=(value)             
     140              super(value)
     141              iso8601date_time = Assumed_Library_Types::ISO8601_DATE_TIME.new(value)
     142              self.year = iso8601date_time.year
     143              self.month = iso8601date_time.month
     144              self.day = iso8601date_time.day
     145              self.minute = iso8601date_time.minute
     146              self.second = iso8601date_time.second
     147              self.hour = iso8601date_time.hour
     148              self.fractional_second = iso8601date_time.fractional_second
     149              self.timezone = iso8601date_time.timezone
     150            end
     151
     152            def magnitude
     153              return DateTime.new(@year,@month,@day,@hour,@minute,@second) -
     154                DateTime.new(0000,1,1,0,0,0) + @fractional_second
     155            end
     156
     157            undef magnitude=
     158
     159            def diff(other)
     160              if self.magnitude >= other.magnitude
     161                past, future = other, self
     162              else
     163                past, future = self, other
     164              end
     165              past_date, past_time = split_date_time(past)
     166              future_date, future_time = split_date_time(future)
     167              time_diff = future_time.magnitude - past_time.magnitude
     168              if future_time.magnitude < past_time.magnitude
     169                future_date.day = future_date.day - 1
     170                time_diff += 24 * 60 * 60
     171              end
     172              date_duration = past_date.diff(future_date)
     173              hour = (time_diff / 60 / 60).to_i
     174              minute = ((time_diff - hour*60*60)/60).to_i
     175              second = (time_diff - hour * 60 *60 - minute * 60).to_i
     176              fractional_second = ((time_diff - time_diff.to_i)*1000000.0).to_i/1000000.0
     177
     178              return DV_Duration.new(date_duration.value + 'T' +
     179                        hour.to_s + 'H' +
     180                        minute.to_s + 'M' +
     181                        second.to_s + fractional_second.to_s[1..-1] + 'S')
     182                                   
     183            end
     184
     185            private
     186
     187            def split_date_time(date_time)
     188              /^(.*)T(.*)$/ =~ date_time.as_string
     189              return DV_Date.new($1), DV_Time.new($2)             
    131190            end
    132191          end
  • ruby/trunk/lib/models/tests/rm/quantity/ts_date_time.rb

    r150 r151  
    1212      @dv_time = DV_Time.new('12:34:56.78')}
    1313    assert_nothing_raised(Exception){
     14      @dv_date_time = DV_Date_Time.new('2009-06-29T12:34:56.78')}
     15    assert_nothing_raised(Exception){
    1416      @dv_duration = DV_Duration.new('P1Y2M3W4DT5H6M7.8S')}
    1517  end
     
    1921    assert_instance_of DV_Date, @dv_date
    2022    assert_instance_of DV_Time, @dv_time
     23    assert_instance_of DV_Date_Time, @dv_date_time
    2124    assert_instance_of DV_Duration, @dv_duration
    2225  end
     
    4548
    4649  def test_dv_time
     50    assert_equal '12:34:56.78', @dv_time.value
    4751    assert_equal 12, @dv_time.hour
    4852    assert_equal 34, @dv_time.minute
    4953    assert_equal 56, @dv_time.second
    5054    assert_equal 0.78, @dv_time.fractional_second
    51     assert_equal (12*60*60 + 34 * 60 + 56 + 0.78), @dv_time.magnitude
     55    assert_equal((12*60*60 + 34 * 60 + 56 + 0.78), @dv_time.magnitude)
    5256    dv_time2 = DV_Time.new('15:36:48.05')
    53     assert_equal 'P0Y0M0W0DT3H1M51.27S', @dv_time.diff(dv_time2)
     57    assert_equal 'P0Y0M0W0DT3H1M51.27S', @dv_time.diff(dv_time2).value
     58  end
     59
     60  def test_dv_date_time
     61    assert_equal '2009-06-29T12:34:56.78', @dv_date_time.value
     62    assert_equal 2009, @dv_date_time.year
     63    assert_equal 6, @dv_date_time.month
     64    assert_equal 29, @dv_date_time.day
     65    assert_equal 12, @dv_date_time.hour
     66    assert_equal 34, @dv_date_time.minute
     67    assert_equal 56, @dv_date_time.second
     68    assert_equal 0.78, @dv_date_time.fractional_second
     69    dv_date_time2 = DV_Date_Time.new('1970-04-19T13:55:30.12')
     70    assert_equal 'P39Y2M1W9DT22H39M26.66S', @dv_date_time.diff(dv_date_time2).value
    5471  end
    5572
  • ruby/trunk/lib/models/tests/test_assumed_library_types.rb

    r149 r151  
    77  def setup
    88    assert_nothing_raised(Exception){@interval = OpenEHR::Assumed_Library_Types::Interval.new(1,2)}
    9     assert_nothing_raised(Exception){@time_definition = OpenEHR::Assumed_Library_Types::TIME_DEFINITIONS.new}
    109    assert_nothing_raised(Exception){@iso8601_date = OpenEHR::Assumed_Library_Types::ISO8601_DATE.new('2009-04-27')}
    1110    assert_nothing_raised(Exception){@iso8601_time = OpenEHR::Assumed_Library_Types::ISO8601_TIME.new('15:55:37.32+0900')}
     
    1716  def test_initialize
    1817    assert_instance_of OpenEHR::Assumed_Library_Types::Interval, @interval
    19     assert_instance_of OpenEHR::Assumed_Library_Types::TIME_DEFINITIONS, @time_definition
    2018    assert_instance_of OpenEHR::Assumed_Library_Types::ISO8601_DATE, @iso8601_date
    2119    assert_instance_of OpenEHR::Assumed_Library_Types::ISO8601_TIME, @iso8601_time
Note: See TracChangeset for help on using the changeset viewer.