[Haskell-cafe] Converting string to System.Time.ClockTime

dokondr dokondr at gmail.com
Thu Dec 8 17:06:59 CET 2011


On Thu, Dec 8, 2011 at 7:39 PM, Antoine Latter <aslatter at gmail.com> wrote:

> On Thu, Dec 8, 2011 at 9:30 AM, dokondr <dokondr at gmail.com> wrote:
> > Ok, maybe you could advise what packages to use for this simple scenario:
> >
> > I have two text strings with dates:
> >
> > s1 = "Wed, 07 Dec 2011 10:09:21 +0000"
> > s2 = "Wed, 07 Dec 2011 10:11:00 +0000"
> >
> > I need:
> > 1) Find how many seconds are between  these dates
> > 2) Calculate the date in the middle between these dates
>
> It looks like you already have 1) and 2) finished, using the 'time'
> package.
>
> > 3) Print out all three dates in the different format, like these:
> >  2011,  7 Dec, Wed, 10:11:00
>
> If you need to convert into a specific time-zone you can use the
> 'utcToLocalTime' function in the 'time' package, which takes a UTCTime
> and a TimeZone to create a 'LocalTime'. I'm just guessing that you
> might want this, as your output format doesn't include time-zone
> information.
>
> Then for formatting, the 'Data.Time.Format' module in the 'time'
> package has the function 'formatTime', which uses the same sort of
> format string used by 'parseTime'.
>
> I hope that helps! It took me a while to find my way around the 'time'
> package properly.
>
> Antoine
>


Thanks so much for your help! I think I finally :) solved this problem:

import Data.Time.Format
import Data.Time.Clock
import Locale
import Data.Maybe
import Data.Time.Clock.POSIX

timeFormat1 = "%a, %d %b %Y %T %z"
timeFormat2 = "%m/%e/%Y %l:%M:%S %p"

s1 = "Wed, 07 Dec 2011 10:09:21 +0000"
s2 = "Wed, 07 Dec 2011 10:11:00 +0000"
t1 = fromJust $ tryParseTime s1 -- :: UTCTime
t2 = fromJust $ tryParseTime s2
pt1 = utcTimeToPOSIXSeconds t1  -- :: POSIXTime
pt2 = utcTimeToPOSIXSeconds t2
pt3 = pt1 + (pt2 - pt1) / 2
t3 = posixSecondsToUTCTime pt3  -- :: UTCTime

-- formatTime :: FormatTime t => TimeLocale -> String -> t -> String
s3 = formatTime defaultTimeLocale timeFormat2 t3

test = (compare t1 t2) == (compare pt1 pt2)

tryParseTime :: String -> Maybe UTCTime
tryParseTime timeStr = tryFormat (parseTime defaultTimeLocale timeFormat1
timeStr :: Maybe UTCTime)
   where
     tryFormat time
        | time == Nothing = parseTime defaultTimeLocale timeFormat2 timeStr
:: Maybe UTCTime
        | otherwise = time
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20111208/3400b865/attachment.htm>


More information about the Haskell-Cafe mailing list