# File xsd/datatypes.rb, line 582
def add_tz(s)
s + of2tz(@data.offset)
end
# File xsd/datatypes.rb, line 551
def of2tz(offset)
diffmin = offset * 24 * 60
if diffmin.zero?
'Z'
else
((diffmin < 0) ? '-' : '+') << format('%02d:%02d',
(diffmin.abs / 60.0).to_i, (diffmin.abs % 60.0).to_i)
end
end
# File xsd/datatypes.rb, line 561
def screen_data(t)
# convert t to a DateTime as an internal representation.
if t.respond_to?(:to_datetime) # 1.9 or later
t.to_datetime
elsif t.is_a?(DateTime)
t
elsif t.is_a?(Date)
t = screen_data_str(t)
t <<= 12 if t.year < 0
t
elsif t.is_a?(Time)
jd = DateTime.civil_to_jd(t.year, t.mon, t.mday, DateTime::ITALY)
fr = DateTime.time_to_day_fraction(t.hour, t.min, [t.sec, 59].min) +
t.usec.to_r / 1000000 / SecInDay
of = t.utc_offset.to_r / SecInDay
DateTime.new0(DateTime.jd_to_ajd(jd, fr, of), of, DateTime::ITALY)
else
screen_data_str(t)
end
end
# File xsd/datatypes.rb, line 526
def to_date
Date.new0(@data.class.jd_to_ajd(@data.jd, 0, 0), 0, @data.start)
end
# File xsd/datatypes.rb, line 498
def to_obj(klass)
if klass == Time
to_time
elsif klass == Date
to_date
elsif klass == DateTime
to_datetime
else
nil
end
end
# File xsd/datatypes.rb, line 510
def to_time
begin
if @data.offset * SecInDay == Time.now.utc_offset
d = @data
usec = (d.sec_fraction * SecInDay * 1000000).round
Time.local(d.year, d.month, d.mday, d.hour, d.min, d.sec, usec)
else
d = @data.newof
usec = (d.sec_fraction * SecInDay * 1000000).round
Time.gm(d.year, d.month, d.mday, d.hour, d.min, d.sec, usec)
end
rescue ArgumentError
nil
end
end
# File xsd/datatypes.rb, line 534
def tz2of(str)
/^(?:Z|(?:([+\-])(\d\d):(\d\d))?)$/ =~ str
sign = $1
hour = $2.to_i
min = $3.to_i
of = case sign
when '+'
of = +(hour.to_r * 60 + min) / 1440 # 24 * 60
when '-'
of = -(hour.to_r * 60 + min) / 1440 # 24 * 60
else
0
end
of
end