Date and DateTime with explicit precision.
Based the pattern[http://martinfowler.com/ap2/timePoint.html] by Martin Fowler.
Author |
Matthew Lipper |
# File lib/runt/pdate.rb, line 26 def civil(*args) precision=nil if(args[0].instance_of?(DPrecision::Precision)) precision = args.shift else return PDate::sec(*args) end pdate = super(*args) pdate.date_precision = precision pdate end
# File lib/runt/pdate.rb, line 125 def PDate.day( yr,mon,day,*ignored ) PDate.civil(DAY, yr, mon, day ) end
# File lib/runt/pdate.rb, line 146 def PDate.default(*args) PDate.civil(DEFAULT, *args) end
# File lib/runt/pdate.rb, line 129 def PDate.hour( yr,mon,day,hr=HOUR.min_value,*ignored ) PDate.civil(HOUR, yr, mon, day,hr,MIN.min_value, SEC.min_value) end
# File lib/runt/pdate.rb, line 141 def PDate.millisecond( yr,mon,day,hr,min,sec,ms,*ignored ) PDate.civil(SEC, yr, mon, day,hr,min, sec, ms, *ignored) #raise "Not implemented yet." end
# File lib/runt/pdate.rb, line 133 def PDate.min( yr,mon,day,hr=HOUR.min_value,min=MIN.min_value,*ignored ) PDate.civil(MIN, yr, mon, day,hr,min, SEC.min_value) end
# File lib/runt/pdate.rb, line 111 def PDate.month( yr,mon,*ignored ) PDate.civil(MONTH, yr, mon, DAY.min_value ) end
# File lib/runt/pdate.rb, line 38 def parse(*args) opts = args.last.is_a?(Hash) ? args.pop : {} pdate = super(*args) pdate.date_precision = opts[:precision] || opts[:date_precision] pdate end
# File lib/runt/pdate.rb, line 137 def PDate.sec( yr,mon,day,hr=HOUR.min_value,min=MIN.min_value,sec=SEC.min_value,*ignored ) PDate.civil(SEC, yr, mon, day,hr,min, sec) end
# File lib/runt/pdate.rb, line 115 def PDate.week( yr,mon,day,*ignored ) #LJK: need to calculate which week this day implies, #and then move the day back to the *first* day in that week; #note that since rfc2445 defaults to weekstart=monday, I'm #going to use commercial day-of-week raw = PDate.day(yr, mon, day) cooked = PDate.commercial(raw.cwyear, raw.cweek, 1) PDate.civil(WEEK, cooked.year, cooked.month, cooked.day) end
# File lib/runt/pdate.rb, line 53 def + (n) raise TypeError, 'expected numeric' unless n.kind_of?(Numeric) ndays = n case @date_precision when YEAR then return DPrecision::to_p(PDate::civil(year+n,month,day),@date_precision) when MONTH then return DPrecision::to_p((self.to_date>>n),@date_precision) when WEEK then ndays = n*7 when DAY then ndays = n when HOUR then ndays = n*(1.to_r/24) when MIN then ndays = n*(1.to_r/1440) when SEC then ndays = n*(1.to_r/86400) when MILLI then ndays = n*(1.to_r/86400000) end DPrecision::to_p((self.to_date + ndays),@date_precision) end
# File lib/runt/pdate.rb, line 77 def - (x) case x when Numeric then return self+(-x) when Date then return super(DPrecision::to_p(x,@date_precision)) end raise TypeError, 'expected numeric or date' end
# File lib/runt/pdate.rb, line 87 def <=> (other) result = nil raise "I'm broken #{self.to_s}" if @date_precision.nil? if(!other.nil? && other.respond_to?("date_precision") && other.date_precision>@date_precision) result = super(DPrecision::to_p(other,@date_precision)) else result = super(other) end puts "self<#{self.to_s}><=>other<#{other.to_s}> => #{result}" if $DEBUG result end
# File lib/runt/pdate.rb, line 49 def include?(expr) eql?(expr) end
FIXME: marshall broken in 1.9
Custom dump which preserves DatePrecision Author:: Jodi Showers
# File lib/runt/pdate.rb, line 156 def marshal_dump [date_precision, ajd, start, offset] end
Generated with the Darkfish Rdoc Generator 2.