Date Time in Haskell

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Date Time in Haskell

Dananji Liyanage
Hi All,

I'm trying out the date time conversions in Haskell.

How do I convert a keyboard input (IO String) to UTCTime?

This is how I'm doing (probably there's a better way), 
              convDay x = read (x ++ " 00:00:00") :: UTCTime
​​

Another thing, how do I convert getCurrentTime (IO UTCTime) to UTCTime in order to get the time difference between the keyboard input date and today?

--
Regards,
Dananji Liyanage

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Date Time in Haskell

Kostiantyn Rybnikov
Hi Dananji!

First of all, for more explicit failure-handling I suggest using "readMay" from package "safe" [0] instead of "read" whenever possible.

Alternative to using "read", if you know date format of input-data, you can take a look at "UNIX-style parsing" section at Data.Time.Format module [1]. If you have older "time" package, you'd probably use parseTime, for newer versions it is recommended to use parseTimeM.

Here's an example:

```
➜  ~  ghci
GHCi, version 7.8.4: http://www.haskell.org/ghc/  :? for help
Prelude> import Data.Time.Format
Prelude Data.Time.Format> import System.Locale
Prelude Data.Time.Format System.Locale> import Data.Time.Clock
Prelude Data.Time.Format System.Locale Data.Time.Clock> parseTime defaultTimeLocale "%F %X" "2014-01-02 11:12:30" :: Maybe UTCTime
Just 2014-01-02 11:12:30 UTC
```

If you have a value of type "IO <something>", you can "extract" it when being in IO monad like this:

main = do
    currentTime <- getCurrentTime
    -- in all remaining code, currentTime has type "UTCTime"
    ...
    getDifference currentTime userTime

In terms of "sugar-less" way to use a value from "IO <something>", you can also use it like this:

getCurrentTime >>= \currentTime -> doSomething currentTime

Hope this helps.

On Thu, May 14, 2015 at 10:20 AM, Dananji Liyanage <[hidden email]> wrote:
Hi All,

I'm trying out the date time conversions in Haskell.

How do I convert a keyboard input (IO String) to UTCTime?

This is how I'm doing (probably there's a better way), 
              convDay x = read (x ++ " 00:00:00") :: UTCTime
​​

Another thing, how do I convert getCurrentTime (IO UTCTime) to UTCTime in order to get the time difference between the keyboard input date and today?

--
Regards,
Dananji Liyanage

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Date Time in Haskell

Dananji Liyanage
Hi Kostiantyn,

Thanks for introducing me to package "Safe" !!

main = do
    currentTime <- getCurrentTime
    -- in all remaining code, currentTime has type "UTCTime"
    ...
    getDifference currentTime userTime

This doesn't work for me.

Correct me if I'm doing something wrong here. Here's my code:

           main = do
                  now <- getCurrentTime
                  diffUTCTime now bree
          bree = readMay "1981-06-16 04:35:25" :: UTCTime

This gives an error like this;
io.hs:28:5:
    Couldn't match expected type ‘IO b’
                with actual type ‘NominalDiffTime’
    Relevant bindings include main :: IO b (bound at io.hs:26:1)
    In a stmt of a 'do' block: diffUTCTime now bree
    In the expression:
      do { now <- getCurrentTime;
           diffUTCTime now bree }


On Thu, May 14, 2015 at 3:55 PM, Kostiantyn Rybnikov <[hidden email]> wrote:
Hi Dananji!

First of all, for more explicit failure-handling I suggest using "readMay" from package "safe" [0] instead of "read" whenever possible.

Alternative to using "read", if you know date format of input-data, you can take a look at "UNIX-style parsing" section at Data.Time.Format module [1]. If you have older "time" package, you'd probably use parseTime, for newer versions it is recommended to use parseTimeM.

Here's an example:

```
➜  ~  ghci
GHCi, version 7.8.4: http://www.haskell.org/ghc/  :? for help
Prelude> import Data.Time.Format
Prelude Data.Time.Format> import System.Locale
Prelude Data.Time.Format System.Locale> import Data.Time.Clock
Prelude Data.Time.Format System.Locale Data.Time.Clock> parseTime defaultTimeLocale "%F %X" "2014-01-02 11:12:30" :: Maybe UTCTime
Just 2014-01-02 11:12:30 UTC
```

If you have a value of type "IO <something>", you can "extract" it when being in IO monad like this:

main = do
    currentTime <- getCurrentTime
    -- in all remaining code, currentTime has type "UTCTime"
    ...
    getDifference currentTime userTime

In terms of "sugar-less" way to use a value from "IO <something>", you can also use it like this:

getCurrentTime >>= \currentTime -> doSomething currentTime

Hope this helps.

On Thu, May 14, 2015 at 10:20 AM, Dananji Liyanage <[hidden email]> wrote:
Hi All,

I'm trying out the date time conversions in Haskell.

How do I convert a keyboard input (IO String) to UTCTime?

This is how I'm doing (probably there's a better way), 
              convDay x = read (x ++ " 00:00:00") :: UTCTime
​​

Another thing, how do I convert getCurrentTime (IO UTCTime) to UTCTime in order to get the time difference between the keyboard input date and today?

--
Regards,
Dananji Liyanage

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners




--
Regards,
Dananji Liyanage

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Date Time in Haskell

Max Voit-2
On Thu, 14 May 2015 16:27:46 +0530
Dananji Liyanage <[hidden email]> wrote:

> Correct me if I'm doing something wrong here. Here's my code:
>
>            main = do
>                   now <- getCurrentTime
>                   diffUTCTime now bree
>           bree = readMay "1981-06-16 04:35:25" :: UTCTime

There are several problems with that code. First what the compiler is
complaining about: Last statement in a do-block must have type of the
block, in this case IO () - so print it or return ()

For the readMay - this is expected to return Maybe UTCTime. To stuff
this into diffUTCTime you need to get it out of the Maybe.

For my formulation "is expected to" - it won't, as UTCTime has no Read
instance (so you can't call read on it). Take a look at ParseTime and
its buildTime method.

cheers, max
_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Date Time in Haskell

Dananji Liyanage
Thanks Max!! 

On Thu, May 14, 2015 at 4:57 PM, Max Voit <[hidden email]> wrote:
On Thu, 14 May 2015 16:27:46 +0530
Dananji Liyanage <[hidden email]> wrote:

> Correct me if I'm doing something wrong here. Here's my code:
>
>            main = do
>                   now <- getCurrentTime
>                   diffUTCTime now bree
>           bree = readMay "1981-06-16 04:35:25" :: UTCTime

There are several problems with that code. First what the compiler is
complaining about: Last statement in a do-block must have type of the
block, in this case IO () - so print it or return ()

For the readMay - this is expected to return Maybe UTCTime. To stuff
this into diffUTCTime you need to get it out of the Maybe.

For my formulation "is expected to" - it won't, as UTCTime has no Read
instance (so you can't call read on it). Take a look at ParseTime and
its buildTime method.

cheers, max
_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



--
Regards,
Dananji Liyanage

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Date Time in Haskell

Michael Orlitzky
In reply to this post by Kostiantyn Rybnikov
On 05/14/2015 06:25 AM, Kostiantyn Rybnikov wrote:
> Hi Dananji!
>
> First of all, for more explicit failure-handling I suggest using "readMay"
> from package "safe" [0] instead of "read" whenever possible.

This is always a good idea, and someone finally added it to the base
library (in 4.6.0.0) as "readMaybe".

  ghci> import Text.Read ( readMaybe )
  ghci> readMaybe "Hello, world!" :: Maybe Integer
  Nothing

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners