How do I get the current time in Elm?

Update for 0.19 It is not possible to get the current time using the standard library.. You need to use elm/time. As with 0.18, all you need is a command and Msg to handle the result

type Msg
    = OnTime Time.Posix 

getTime : Cmd Msg
getTime = 
    Task.perform OnTime Time.now 

Update for 0.18 This has got simpler again. Now all you need is a command and Msg to handle the result

type Msg
    = OnTime Time 

getTime : Cmd Msg
getTime = 
    Task.perform OnTime Time.now 

See this Ellie

Original answer

With 0.17, this got a whole lot easier. There is now a Task in the Time library. So for example, we now have:

Time.now
|> Task.Perform NoOp CurrentTime

You can use the Time package and/or the Date package.

Here's a contrived example which uses both:

import Signal
import Time exposing (every, second)
import Date exposing (year, hour, minute, second, fromTime)
import Graphics.Element exposing (show)

main =
  Signal.map currentTime (Time.every Time.second)

currentTime t =
  let date' = fromTime t
      hour' = toString (Date.hour date')
      minute' = toString (Date.minute date')
      second' = toString (Date.second date')
      year' = toString (year date')
      now = "The current time is: " ++ hour' ++ ":" ++ minute' ++ ":" ++ second'
  in 
      show now

To resolve my own question, I've created a variant of StartApp that includes a timestamp on each action.
So the update function has signature:
update : action -> Time -> model -> (model, Effects action)

The Gist is here. https://gist.github.com/z5h/41ca436679591b6c3e51

Tags:

Time

Elm