Perfect, thanks, that looks exactly like what I need!

 

Should this code also go into the Dates.jl package for julia 0.3?

 

From: [email protected] [mailto:[email protected]] On 
Behalf Of Jacob Quinn
Sent: Wednesday, March 18, 2015 8:34 PM
To: [email protected]
Subject: Re: [julia-users] Re: Time type

 

Here's 50 lines that implement the bulk of the functionality. Might be worth 
just throwing this in Base since it's so simple. (this is 0.4 compatible, 
you'll want to do just `using Dates` for 0.3)

 

 

 

using Base.Dates

 

immutable Time

    value::Millisecond

end

 

MS(x) = Millisecond(x)

value(x::Time) = x.value.value

 

function Time(h::Int32=0,m::Int32=0,s::Int32=0,ms::Int32=0)

    -1 < h < 24 || throw(ArgumentError("Hour: $h out of range (0:23)"))

    -1 < m < 60 || throw(ArgumentError("Minute: $m out of range (0:59)"))

    -1 < s < 60 || throw(ArgumentError("Second: $s out of range (0:59)"))

    -1 < ms < 1000 || throw(ArgumentError("Millisecond: $ms out of range 
(0:999)"))

    return Time(MS(ms + Int32(1000)*s + Int32(60000)*m + Int32(3600000)*h))

end

 

Time(h::Hour,m::Minute=Minute(0),s::Second=Second(0),ms::Millisecond=Millisecond(0))
 = Time(Int32(h),Int32(m),Int32(s),Int32(ms))

_c(c) = convert(Int32,c)

Time(h,m=0,s=0,ms=0) = Time(_c(h),_c(m),_c(s),_c(ms))

 

Base.isfinite{T<:Time}(::Union(Type{T},T)) = true

Base.eps(t::Time) = Millisecond(1)

Base.typemax(::Union(Time,Type{Time})) = Time(23,59,59,999)

Base.typemin(::Union(Time,Type{Time})) = Time(0,0,0,0)

Base.isless(x::Time,y::Time) = isless(value(x),value(y))

==(x::Time,y::Time) = ===(value(x),value(y))

 

hour(t::Time)   = mod(fld(value(t),3600000),24)

minute(t::Time) = mod(fld(value(t),60000),60)

second(t::Time) = mod(fld(value(t),1000),60)

millisecond(t::Time) = mod(value(t),1000)

 

(+)(x::Time,y::Dates.TimePeriod)   = return Time(MS(value(x)+Dates.toms(y)))

(-)(x::Time,y::Dates.TimePeriod)   = return Time(MS(value(x)-Dates.toms(y)))

(+)(y::Dates.TimePeriod,x::Time) = x + y

(-)(y::Dates.TimePeriod,x::Time) = x - y

 

function Base.string(t::Time)

    h,mi,s = hour(t),minute(t),second(t)

    hh = lpad(h,2,"0")

    mii = lpad(mi,2,"0")

    ss = lpad(s,2,"0")

    ms = millisecond(t) == 0 ? "" : string(millisecond(t)/1000.0)[2:end]

    return "$hh:$mii:$ss$(ms)"

end

Base.show(io::IO,x::Time) = print(io,string(x))

 

On Wed, Mar 18, 2015 at 9:43 AM, Seth <[email protected] 
<mailto:[email protected]> > wrote:

Apropos? https://www.youtube.com/watch?v=-5wpm-gesOY

On Saturday, March 14, 2015 at 7:28:23 AM UTC-7, Stefan Karpinski wrote:

There are no leap seconds in universal time. There are leap seconds in UTC 
which bridges terrestrial time (SI seconds) with universal time (day = 1 earth 
rotation; second = 1/86400 of an earth rotation) by using SI seconds as the 
basic unit but introducing leap seconds here and there to ensure that UTC days 
stay in sync with terrestrial days (but not terrestrial seconds). This is why 
Date x Time ≅ DateTime for UT.

 

 

Reply via email to