[Haskell-cafe] TimeDiff to Int?
Lyle Kopnicky
lists at qseep.net
Wed Nov 12 17:29:22 EST 2008
Thanks Philip and Roger,
I think I'll use...
floor $ toRational td
...although I could have sworn that didn't work last night. I don't see that
TimeDiff has an instance of RealFrac, where floor is defined, though it does
have a instances of Real and Fractional.
Yes, the numeric classes are a bit hard to follow. Especially confusing is
the conversions. I'm thinking of making a multiparameter Coercible class,
with a coerce function, to help address that.
- Lyle
On Wed, Nov 12, 2008 at 9:43 AM, Philip Weaver <philip.weaver at gmail.com>wrote:
>
>
> 2008/11/12 Lyle Kopnicky <lists at qseep.net>
>
> Hi folks,
>>
>> I had some code using the oldtime package, and want to convert it to use
>> the time package.
>>
>> One of the things I need to do is calculate the number of seconds since
>> midnight. The easy part is getting a TimeDiff result:
>>
>> utc <- getCurrentTime
>> tz <- getCurrentTimeZone
>> let td = timeOfDayToTime $ localTimeOfDay $ utcToLocalTime tz utc
>>
>> Now td is a TimeDiff representation of the number of seconds since
>> midnight. It prints nicely, but I'm having a heck of a time figuring out how
>> to truncate it to an Int.
>>
>> The floor function is only supported by the RealFrac class. Although
>> TimeDiff has an instance of RealFrac and Fractional, it doesn't have an
>> instance of RealFrac. I looked up the various to* and from* functions and
>> have come up short. fromEnum yields an Int but it's the wrong value. I know
>> I could use show and then use readS to get an Integer, or use formatTime
>> (and reparse that), but that's a hack.
>>
>> I can convert it to a TimeOfDay which gives me hours, minutes, and
>> seconds, but then I have to do arithmetic on it, and the seconds are of type
>> Pico, which I can't call floor on either. I can convert it to a Rational via
>> timeOfDayToDayFraction, but a TimeDiff is already a Rational those don't
>> have floor.
>>
>> What am I missing? There has got to be an easy way to count seconds!
>>
>
> Well, you could always (read . takeWhile (not . (=='.')) . show), but
> here's a better way:
>
> let x = toRational td
> in numerator x `div` denominator x
>
> This was just the first thing I could come up with. I bet there's a nicer
> way.
>
> - Phil
>
>
>> Thanks,
>> Lyle
>>
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20081112/c571d0c2/attachment.htm
More information about the Haskell-Cafe
mailing list