class XSD::XSDDateTime

Constants

Type

Public Class Methods

new(value = nil) click to toggle source
# File lib/xsd/datatypes.rb, line 606
def initialize(value = nil)
  init(Type, value)
end

Private Instance Methods

_set(data) click to toggle source
# File lib/xsd/datatypes.rb, line 641
def _set(data)
  if data.nil?
    @data = @secfrac = nil
    return
  end
  @data, @secfrac = data
end
_to_s() click to toggle source
# File lib/xsd/datatypes.rb, line 649
def _to_s
  year = (@data.year > 0) ? @data.year : @data.year - 1
  s = format('%.4d-%02d-%02dT%02d:%02d:%02d',
    year, @data.mon, @data.mday, @data.hour, @data.min, @data.sec)
  if @data.sec_fraction.nonzero?
    if @secfrac
      s << ".#{ @secfrac }"
    else
      s << sprintf("%.16f",
        (@data.sec_fraction * DayInSec).to_f).sub(/^0/, '').sub(/0*$/, '')
    end
  end
  add_tz(s)
end
screen_data_str(t) click to toggle source
# File lib/xsd/datatypes.rb, line 612
def screen_data_str(t)
  /^([+\-]?\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d(?:\.(\d*))?)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
  unless Regexp.last_match
    raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.")
  end
  if $1 == '0000'
    raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.")
  end
  year = $1.to_i
  if year < 0
    year += 1
  end
  mon = $2.to_i
  mday = $3.to_i
  hour = $4.to_i
  min = $5.to_i
  sec = $6.to_i
  secfrac = $7
  zonestr = $8
  data = DateTime.civil(year, mon, mday, hour, min, sec, tz2of(zonestr))
  if secfrac
    diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / DayInSec
    data += diffday
    # FYI: new0 and jd_to_rjd are not necessary to use if you don't have
    # exceptional reason.
  end
  [data, secfrac]
end