Search code examples
elm

How do I get the current date in elm?


I'm trying to figure out how to get the current date in elm in version .17. I see that they added a Date module to .17 but I haven't found any examples on how it's used. Has anyone figured out how to do this?

Edit: In trying to retrofit this solution, I hit another stumbling block. I'm trying to trigger setting the date and then calling another Msg to do something else. But I'm still getting {} for a date.

import Html.App as App
import Html exposing (..)
import Time exposing (Time)
import Task
import Date exposing (Date)
import Html.Events exposing (onClick)
import Html.Attributes exposing (..)

type alias Model =
  {currentDate : Maybe Date}

type Msg =
  SetDate (Maybe Date)
  | TriggerDateSet

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    SetDate date ->
      ({model | currentDate = date}, Cmd.none)
    TriggerDateSet ->
      (model, now)

view : Model -> Html Msg
view model =
  div []
  [ div []
    [ button [onClick TriggerDateSet] [] ]
  , div [] [ text <| "(Optional) time at program launch was " ++ toString model ]
  ]

now : Cmd Msg
now =
  Task.perform (always (SetDate Nothing)) (Just >> SetDate) Date.now

main : Program Never
main =
  App.program
    { init = ( Model Nothing, now )
    , view = view
    , subscriptions = always Sub.none
    , update = update
    }

Solution

  • You'll want the now Task or the every Subscription from Time.

    Here's an example using the former to initialise the model with the current time.

    import Html.App as App
    import Html exposing (..)
    import Time exposing (Time)
    import Task
    
    
    type alias Model = 
      Maybe Time
    
    
    type Msg = 
      SetTime (Maybe Time)
    
    
    update : Msg -> Model -> (Model, Cmd Msg)
    update (SetTime time) _ = 
      (time, Cmd.none)
    
    
    view : Model -> Html Msg
    view model =
      div [] [ text <| "(Optional) time at program launch was " ++ toString model ]
    
    
    now : Cmd Msg
    now = 
      Task.perform (Just >> SetTime) Time.now
    
    
    main : Program Never
    main =
      App.program 
        { init = ( Nothing, now ) 
        , view = view
        , subscriptions = always Sub.none 
        , update = update
        }