Ruby/Date/Date Calculation

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск

Содержание

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