I\'m running elm-repl to play around with the language.
I\'d like to see what the current time is. How would I do that? It doesn\'t appear to be possible with the c
You can see pdoherty926's answer for how to do something with the current time in Elm.
elm-repl
doesn't have the ability to work with Signal
s, and time "changes over time" so it's a signal.
There also isn't a Task
for getting the time, that I know of. Nor a way to execute tasks in the repl, though I expect that will be feature in the future.
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
If you want the time as of program start you can do the following:
Now.elm
module Now where
import Native.Now
loadTime : Float
loadTime = Native.Now.loadTime
Native/Now.js
Elm.Native.Now = {};
Elm.Native.Now.make = function(localRuntime) {
localRuntime.Native = localRuntime.Native || {};
localRuntime.Native.Now = localRuntime.Native.Now || {};
if (localRuntime.Native.Now.values) {
return localRuntime.Native.Now.values;
}
var Result = Elm.Result.make(localRuntime);
return localRuntime.Native.Now.values = {
loadTime: (new window.Date).getTime()
};
};
your code
programStart = Now.loadTime
There are two main ways I can think of to work with the current time in Elm:
Write / use a native module to make a function that returns the current time in ms (or returns a task that will do the same). This method isn't generally recommended. I think #2 is a better approach. But an example of #1 can be found here: https://github.com/evancz/task-tutorial/blob/1.0.2/src/TaskTutorial.elm (see the getCurrentTime
function)
Write a program using the Elm application architecture (https://github.com/evancz/elm-architecture-tutorial/), and then feed the current time signal as an input to the update cycle, updating the model with the new current time at every interval of your choosing. Then all of your other methods can just fetch the current time synchronously off of the model.
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