Date
, Time
and DateTime
The services are split in 2 classes:
Date
handles the year, month and day parts of the date.Time
handles the time in hours, minutes and seconds.These are united in DateTime
for a precise time in a precise day.
var now = new Time.now
var midnight = new Time(0, 0, 0)
assert now > midnight
var nine_thirty = new Time(9, 30, 0)
var eleven_twenty = new Time(11, 20, 0)
assert eleven_twenty > nine_thirty
var pi_day = new Date(2015, 03, 14)
var may_the_fourth = new Date(2015, 5, 4)
assert pi_day < may_the_fourth
var now_t = new DateTime.now
var epoch = new DateTime(1970, 1, 1, 0, 0, 0)
assert now_t > epoch
core :: union_find
union–find algorithm using an efficient disjoint-set data structure
# Services to manipulate `Date`, `Time` and `DateTime`
#
# The services are split in 2 classes:
#
# * `Date` handles the year, month and day parts of the date.
# * `Time` handles the time in hours, minutes and seconds.
#
# These are united in `DateTime` for a precise time in a precise day.
#
# ~~~
# var now = new Time.now
# var midnight = new Time(0, 0, 0)
# assert now > midnight
#
# var nine_thirty = new Time(9, 30, 0)
# var eleven_twenty = new Time(11, 20, 0)
# assert eleven_twenty > nine_thirty
#
# var pi_day = new Date(2015, 03, 14)
# var may_the_fourth = new Date(2015, 5, 4)
# assert pi_day < may_the_fourth
#
# var now_t = new DateTime.now
# var epoch = new DateTime(1970, 1, 1, 0, 0, 0)
# assert now_t > epoch
# ~~~
#
module date
# A time of the day, composed of an `hour`, a `minute` and a `second` count
class Time
super Comparable
redef type OTHER: Time
# The hour part of this time, between 0 and 23
var hour: Int
# The minute within the hour, between 0 and 59
var minute: Int
# The second within the minute, between 0 and 59
var second: Int
# Get the current time of the day
init now do
var tm = new Tm.localtime
init(tm.hour, tm.min, tm.sec)
end
# Get the difference between two times in second
fun diff_time(other: Time): Int do
return (hour * 3600 + minute * 60 + second) -
(other.hour * 3600 + other.minute * 60 + other.second)
end
redef fun ==(d) do return d isa Time and time_eq(d)
redef fun <(d) do return self.diff_time(d) < 0
redef fun hash do return hour * 1024 + minute * 64 + second
private fun time_eq(other: Time): Bool
do
return hour * 3600 + minute * 60 + second ==
other.hour * 3600 + other.minute * 60 + other.second
end
end
# A date, composed by a `year`, a `month` and a `day`
class Date
super Comparable
redef type OTHER: Date
# Year, ex: 1989
var year: Int
# Month as an integer, `1` for January, `2` for February, etc.
var month: Int
# Day of the month
var day: Int
# UTC time zone
#
# FIXME this value is not yet applied
var time_zone = "Z"
# The date of this day
init today do
var tm = new Tm.localtime
init(1900 + tm.year, tm.mon + 1, tm.mday)
end
# `self` formatted according to ISO 8601
redef fun to_s do return "{year}-{month}-{day}"
# Difference in days between `self` and `other`
fun diff_days(other: Date): Int
do
var y_out = year - other.year
y_out = y_out * 365
var m_out = month - other.month
m_out = m_out * 30 # FIXME
return day - other.day + m_out + y_out
end
# Difference in months between `self` and `other`
fun diff_months(other: Date): Int
do
var y_out = year - other.year
y_out = y_out * 12
return month - other.month + y_out
end
# Difference in years between `self` and `other`
fun diff_years(other: Date): Int do return year - other.year
redef fun ==(d) do return d isa Date and self.diff_days(d) == 0
redef fun hash do return year + month * 1024 + day * 2048
redef fun <(d) do return self.diff_days(d) < 0
# Is `self` is between the years of `a` and `b`?
private fun is_between_years(a, b: Date): Bool
do
return (a.year > year and b.year < year) or (b.year > year and a.year < year) or (a.year == year or b.year == year)
end
# Is `self` is between the months of `a` and `b`?
private fun is_between_months(a, b: Date) : Bool
do
if not self.is_between_years(a,b) then return false
return (a.month > month and b.month < month) or (b.month > month and a.month < month) or (a.month == month or b.month == month)
end
# Is `self` between `a` and `b`?
redef fun is_between(a, b)
do
if not self.is_between_months(a, b) then return false
return (a.day > day and b.day < day) or (b.day > day and a.day < day) or (a.day == day or b.day == day)
end
end
# A `Time` in a `Date`
class DateTime
super Date
super Time
redef type OTHER: DateTime
autoinit year, month, day, hour, minute, second
# Get the current `DateTime`
init now
do
super
today
end
redef fun ==(other) do return other isa DateTime and diff_days(other) == 0 and time_eq(other)
redef fun to_s do return "{super} {hour}:{minute}:{second}{time_zone}"
end
lib/date/date.nit:15,1--176,3