lib/barometer/data/local_datetime.rb in barometer-0.7.3 vs lib/barometer/data/local_datetime.rb in barometer-0.8.0
- old
+ new
@@ -1,63 +1,63 @@
require 'date'
module Barometer
#
# A simple DateTime class
- #
+ #
# A time class that represents the local date_time ...
# it has no concept of time zone
#
class Data::LocalDateTime < Data::LocalTime
-
+
attr_reader :year, :month, :day
def initialize(y,mon,d,h=0,m=0,s=0)
raise(ArgumentError, "invalid date") unless y && mon && d && Date.civil(y,mon,d)
@year = y
@month = mon
@day = d
super(h,m,s)
self
end
-
+
def year=(y)
unless y && y.is_a?(Fixnum) && Date.civil(y,@month,@day)
raise(ArgumentError, "invalid year")
end
@year = y
end
-
+
def month=(m)
unless m && m.is_a?(Fixnum) && Date.civil(@year,m,@day)
raise(ArgumentError, "invalid month")
end
@month = m
end
-
+
def day=(d)
unless d && d.is_a?(Fixnum) && Date.civil(@year,@month,d)
raise(ArgumentError, "invalid day")
end
@day = d
end
-
- def parse(string)
+
+ def parse(string, format=nil)
return unless string
- new_date = Data::LocalDateTime.parse(string)
+ new_date = Data::LocalDateTime.parse(string, format)
@year = new_date.year
@month = new_date.month
@day = new_date.day
@hour = new_date.hour
@min = new_date.min
@sec = new_date.sec
self
end
-
- def self.parse(string)
+
+ def self.parse(string, format=nil)
return nil unless string
return string if string.is_a?(Data::LocalDateTime)
-
+
year = nil; month = nil; day = nil;
hour = nil; min = nil; sec = nil;
if string.is_a?(Time) || string.is_a?(DateTime)
year = string.year
month = string.mon
@@ -69,11 +69,15 @@
year = string.year
month = string.mon
day = string.day
elsif string.is_a?(String)
begin
- datetime = Time.parse(string)
+ datetime = if format
+ Time.strptime(string, format)
+ else
+ DateTime.parse(string)
+ end
year = datetime.year
month = datetime.mon
day = datetime.day
hour = datetime.hour
min = datetime.min
@@ -82,31 +86,31 @@
return nil
end
end
Data::LocalDateTime.new(year, month, day, hour, min, sec)
end
-
+
# convert to a Date class
#
def to_d
Date.civil(@year, @month, @day)
end
-
+
# convert to a DateTime class
#
def to_dt
DateTime.new(@year, @month, @day, @hour, @min, @sec)
end
-
+
def <=>(other)
if other.is_a?(String) || other.is_a?(Time) || other.is_a?(DateTime) || other.is_a?(Date)
the_other = Data::LocalDateTime.parse(other)
else
the_other = other
end
raise ArgumentError unless the_other.is_a?(Data::LocalDateTime) || the_other.is_a?(Data::LocalTime)
-
+
if ((other.is_a?(String) || other.is_a?(Time) || other.is_a?(DateTime)) &&
the_other.is_a?(Data::LocalDateTime)) || other.is_a?(Data::LocalDateTime)
# we are counting days + seconds
if (_total_days <=> the_other._total_days) == 0
return total_seconds <=> the_other.total_seconds
@@ -119,23 +123,23 @@
elsif the_other.is_a?(Data::LocalTime)
# we are counting seconds
return total_seconds <=> the_other.total_seconds
end
end
-
+
def to_s(time=false)
datetime = self.to_dt
format = (time ? "%Y-%m-%d %I:%M:%S %p" : "%Y-%m-%d")
datetime.strftime(format).downcase
end
-
+
def nil?; @year == 0 && @month == 0 && @day == 0 && super; end
-
+
# this assumes all years have 366 days (which only is true for leap years)
# but since this is just for comparisons, this will be accurate
#
def _total_days
self.to_d.yday + (@year * 366)
end
-
+
end
end