Ruby/Date/Date Calculation
Материал из Wiki.crossplatform.ru
(Различия между версиями)
Версия 17:10, 26 мая 2010
Add and subtract six months using the >> and
require "date" date = Date.new( 2006, 11, 8 ) puts (date >> 6).to_s puts (date << 6).to_s
advent calendar
require "date" def advent_calendar(date=DateTime.now) christmas = DateTime.new(date.year, 12, 25) christmas = DateTime.new(date.year+1, 12, 25) if date > christmas difference = (christmas-date).to_i if difference == 0 puts "Today is Christmas." else puts "Only #{difference} day#{"s" unless difference==1} until Christmas." end end advent_calendar(DateTime.new(2006, 12, 24))
Counting the Days Since an Arbitrary Date
require "date" def last_modified(file) t1 = File.stat(file).ctime t2 = Time.now elapsed = (t2-t1)/(60*60*24) puts "#{file} was last modified #{elapsed} days ago." end last_modified("c:\\")
Doing Date Arithmetic
require "date" puts y2k = Time.gm(2000, 1, 1) # => Sat Jan 01 00:00:00 UTC 2000 puts y2k + 1 # => Sat Jan 01 00:00:01 UTC 2000 puts y2k - 1 # => Fri Dec 31 23:59:59 UTC 1999 puts y2k + (60 * 60 * 24 * 365) # => Sun Dec 31 00:00:00 UTC 2000
Doing DateTime Arithmetic
require "date" puts y2k_dt = DateTime.new(2000, 1, 1) puts (y2k_dt + 1).to_s # => "2000-01-02T00:00:00Z" puts (y2k_dt - 1).to_s # => "1999-12-31T00:00:00Z" puts (y2k_dt + 0.5).to_s # => "2000-01-01T12:00:00Z" puts (y2k_dt + 365).to_s # => "2000-12-31T00:00:00Z"
leap year day
require "date" leap_year_day = Date.new(1996, 2, 29) (leap_year_day << 1).to_s # => "1996-01-29" (leap_year_day >> 1).to_s # => "1996-03-29" (leap_year_day >> 12).to_s # => "1997-02-28" (leap_year_day << 12 * 4).to_s # => "1992-02-29"
Minus DateTime by day
require "date" sent = DateTime.new(2006, 10, 4, 3, 15) received = DateTime.new(2006, 10, 5, 16, 33) elapsed = (received-sent) * 24 puts "#{elapsed.to_f} hours after."
Minus one DateTime from another
require "date" day_one = DateTime.new(1999, 12, 31) day_two = DateTime.new(2000, 1, 1) day_two - day_one # => Rational(1, 1) day_one - day_two # => Rational(-1, 1)
Move DateTime
require "date" puts y2k_dt = DateTime.new(2000, 1, 1) puts (y2k_dt >> 1).to_s # => "2000-02-01T00:00:00Z" puts (y2k_dt << 1).to_s # => "1999-12-01T00:00:00Z"
Remaining days
require "date" def remaining(date, event) intervals = [["day", 1], ["hour", 24], ["minute", 60], ["second", 60]] elapsed = DateTime.now - date tense = elapsed > 0 ? "since" : "until" interval = 1.0 parts = intervals.collect do |name, new_interval| interval /= new_interval number, elapsed = elapsed.abs.divmod(interval) "#{number.to_i} #{name}#{"s" unless number == 1}" end puts "#{parts.join(", ")} #{tense} #{event}." end remaining(DateTime.new(2006, 4, 15, 0, 0, 0, DateTime.now.offset),"the book deadline")
Subtract 61 days from a date:
require "date" date = Date.new( 2006, 11, 8 ) puts (date - 61).to_s